# Manawa Terminal

> Live market data, financial analysis, and portfolio research tools across 10,000+ tickers.

- name: app.manawa/manawa-terminal
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 80/100 flags: no-repository
- quality: 66/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/app.manawa%2Fmanawa-terminal
- tools: https://api.protogrid.dev/v1/servers/app.manawa%2Fmanawa-terminal/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "manawa-terminal": {
      "type": "http",
      "url": "https://mcp.manawa.app/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% ~updated-76d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 66/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 3 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 39 of 39 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: update_screener (idempotentHint); create_portfolio (idempotentHint); add_transaction (idempotentHint); …
- pass `tools.token_cost`: about 7,714 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 20 tool changes in 30 days
- fail `stability.rug_pull`: 3 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 39, about 7,714 tokens to load them all
- tool set hash: 2d44afddf217616bf7c1748f3fd76fe1
- tools last changed: 2026-10-17T02:20:34.669Z
- badge: [![protogrid quality](https://protogrid.dev/badge/app.manawa/manawa-terminal.svg)](https://protogrid.dev/servers/app.manawa/manawa-terminal)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-17 `get_portfolio_statistics` changed (description)
  - before: Get portfolio performance statistics (returns, allocation, risk). dividend_income and dividends are the cash received, by stock. total_gain is unrealized_pnl + realized_pnl. Dividends lower the open cost while the shares are held and sit in realized_pnl after they are sold. Do not add dividend_income on top of total_gain. Args: portfolio_id: The portfolio UUID
  - after: Get portfolio performance statistics (returns, allocation, risk). gross_exposure and net_exposure are in book currency. A weight may be negative. dividend_income is cash by stock and can be negative when a short owes the dividend. total_gain is unrealized_pnl + realized_pnl. Do not add dividend_income on top of total_gain. Args: portfolio_id: The portfolio UUID
- 2026-10-17 `get_positions` changed (description)
  - before: Get current holdings with quantity, cost basis, market value, and unrealized P&L. Open cost is already net of dividends still held on those shares. Cash includes dividend cash. Realized P&L from shares already sold is on get_portfolio_statistics. Args: portfolio_id: The portfolio UUID
  - after: Get current holdings with quantity, cost basis, market value, and unrealized P&L. A short has negative shares, a positive avg_cost, a negative total_cost_book (the open credit), and a negative market value. Unrealized profit is positive. Cash includes short proceeds and is reduced when the short owes a dividend. Open cost of a long is already net of dividends still held. Realized P&L from closed longs and shorts is on get_portfolio_statistics. Args: portfolio_id: The portfolio UUID
- 2026-10-17 `add_transaction` changed (description)
  - before: Add a buy, sell, deposit, withdrawal, or dividend to a portfolio. A dividend names the stock, not $CASH. qty is the shares, price is the amount per share and must be greater than 0, and date is the pay date. Cash increases and the share count does not. The open cost drops by the part still held; the part already sold is realized P&L. Saving a buy or sell also records older dividends those shares were entitled to. Args: portfolio_id: The portfolio UUID symbol: Stock symbol (e.g. "AAPL"). For deposit/withdrawal use "$CASH" (aliases "CASH" / blank are normalized to "$CASH"). side: "buy", "sell", "deposit", "withdrawal", or "dividend" qty: Number of shares (or cash amount for deposit/withdrawal) price: Price per share, or the dividend amount per share date: Trade date, or the dividend pay date (YYYY-MM-DD)
  - after: Add a buy, sell, deposit, withdrawal, dividend, short, or cover to a portfolio. A short names the stock. qty is the shares sold short. price is the sale price per share. A cover names the stock. qty is the shares bought back. price is the price per share. Neither uses $CASH. A short while long, a cover larger than the short, a sell larger than the long, and a buy while short come back as the terminal's 400. Do not rewrite that error into a success. A dividend names the stock, not $CASH. qty is the shares, price is the amount per share and must be greater than 0, and date is the pay date. Cash increases on a long and decreases on a short. The share count does not change. The open cost of a long drops by the part still held. A short's open credit shrinks. The closed slice is realized P&L. Args: portfolio_id: The portfolio UUID symbol: Stock symbol (e.g. "AAPL"). For deposit/withdrawal use "$CASH" (aliases "CASH" / blank are normalized to "$CASH"). side: "buy", "sell", "deposit", "withdrawal", "dividend", "short", or "cover" qty: Number of shares (or cash amount for deposit/withdrawal) price: Price per share, or the dividend amount per share date: Trade date, or the dividend pay date (YYYY-MM-DD)
- 2026-10-14 `get_portfolio_statistics` changed (description) **meaning changed**
  - before: Get portfolio performance statistics (returns, allocation, risk). Args: portfolio_id: The portfolio UUID
  - after: Get portfolio performance statistics (returns, allocation, risk). dividend_income and dividends are the cash received, by stock. total_gain is unrealized_pnl + realized_pnl. Dividends lower the open cost while the shares are held and sit in realized_pnl after they are sold. Do not add dividend_income on top of total_gain. Args: portfolio_id: The portfolio UUID
- 2026-10-14 `get_positions` changed (description)
  - before: Get current holdings with quantity, cost basis, market value, and unrealized P&L. Args: portfolio_id: The portfolio UUID
  - after: Get current holdings with quantity, cost basis, market value, and unrealized P&L. Open cost is already net of dividends still held on those shares. Cash includes dividend cash. Realized P&L from shares already sold is on get_portfolio_statistics. Args: portfolio_id: The portfolio UUID
- 2026-10-14 `add_transaction` changed (description)
  - before: Add a buy, sell, deposit, or withdrawal transaction to a portfolio. Args: portfolio_id: The portfolio UUID symbol: Stock symbol (e.g. "AAPL"). For deposit/withdrawal use "$CASH" (aliases "CASH" / blank are normalized to "$CASH"). side: "buy", "sell", "deposit", or "withdrawal" qty: Number of shares (or cash amount for deposit/withdrawal) price: Price per share date: Transaction date (YYYY-MM-DD)
  - after: Add a buy, sell, deposit, withdrawal, or dividend to a portfolio. A dividend names the stock, not $CASH. qty is the shares, price is the amount per share and must be greater than 0, and date is the pay date. Cash increases and the share count does not. The open cost drops by the part still held; the part already sold is realized P&L. Saving a buy or sell also records older dividends those shares were entitled to. Args: portfolio_id: The portfolio UUID symbol: Stock symbol (e.g. "AAPL"). For deposit/withdrawal use "$CASH" (aliases "CASH" / blank are normalized to "$CASH"). side: "buy", "sell", "deposit", "withdrawal", or "dividend" qty: Number of shares (or cash amount for deposit/withdrawal) price: Price per share, or the dividend amount per share date: Trade date, or the dividend pay date (YYYY-MM-DD)
- 2026-10-13 `run_screener` added
  - Re-run a saved screener; persist last_symbols; return entered/exited. First seed does not notify. Later runs notify joiners and leavers when Settings Screener in & out is on. Same path as Terminal Run now. Args: screener_id: The screener UUID from list_screeners
- 2026-10-13 `delete_screener` added
  - Delete a saved screener by ID. Args: screener_id: The screener UUID from list_screeners
- 2026-10-13 `update_screener` added
  - Update a saved screener's name, query, schedule, or baseline symbols. Args: screener_id: The screener UUID from list_screeners name: New name (optional) query: Updated filter blob (optional) schedule: "off", "daily", or "weekly" (optional; weekly requires Pro) notify_on_change: Toggle enter/exit notifies (optional) last_symbols: Refresh enter/exit baseline from the live table (optional)
- 2026-10-13 `create_screener` added
  - Save a screener filter query for scheduled enter/exit (joiner/leaver) notifies. Same rows as Terminal Save on /screener. Pass last_symbols (current matches) or call run_screener after create to seed the baseline; later runs notify names that enter or leave when Settings Screener in & out is on. Args: name: Screener name (blank → derived from filters) query: Filter blob {universe, fmp, metrics, ai, member?, view?} schedule: "off", "daily", or "weekly" (weekly requires Pro) notify_on_change: Notify on enter/exit after the first seed (default true) last_symbols: Current result tickers to seed the enter/exit baseline

Full history: https://api.protogrid.dev/v1/servers/app.manawa%2Fmanawa-terminal/changes

## Remotes

- https://mcp.manawa.app/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (39)

- `add_transaction`: Add a buy, sell, deposit, withdrawal, dividend, short, or cover to a portfolio.

    A short names the stock. qty is the shares sold short. price is the sale
    price per share. A cover names the stock. qty is the shares bought back.
    price is the price per share. Neither uses $CASH. A short while long, a
    cover larger than the short, a sell larger than the long, and a buy while
    short come back as the terminal's 400. Do not rewrite that error into a success.

    A dividend names the stock, not $CASH. qty is the shares, price is the
    amount per share and must be greater than 0, and date is the pay date.
    Cash increases on a long and decreases on a short. The share count does
    not change. The open cost of a long drops by the part still held. A
    short's open credit shrinks. The closed slice is realized P&L.

    Args:
        portfolio_id: The portfolio UUID
        symbol: Stock symbol (e.g. "AAPL"). For deposit/withdrawal use "$CASH"
            (aliases "CASH" / blank are normalized to "$CASH").
        side: "buy", "sell", "deposit", "withdrawal", "dividend", "short", or "cover"
        qty: Number of shares (or cash amount for deposit/withdrawal)
        price: Price per share, or the dividend amount per share
        date: Trade date, or the dividend pay date (YYYY-MM-DD)
    
- `create_alert`: Create a price alert, an event alert, or a clock.

    Calling this stores the alert. A clock may omit the ticker.

    Args:
        symbol: Stock symbol (e.g. "AAPL"). Required for price and event alerts. Optional for a clock.
        alert_type: "target_price", "movement_pct", "event", or "schedule"
        direction: Required for price alerts — "above", "below", or "either"
        threshold: Required for price alerts — price level or percentage move
        notes: Optional description. Not the agent instruction.
        event_types: Required when alert_type is "event". Live-tape ids such as
            filing_13f, politician_senate, options_unusual, ipo_upcoming.
        event_filters: Optional slices. Example: {"politician_senate": {"type": ["purchase"]}}.
            An omitted field matches every value.
        name: Optional title. Blank is filled from the rule.
        agent_instruction: What the agent does when this fires. Empty means notify only.
        max_fires: How many fires before it leaves Active. Omit to keep a repeating alert firing.
        schedule_at: ISO time. Required when alert_type is "schedule".
        schedule_tz: IANA zone. UTC when omitted.
        schedule_repeat: once, daily, weekdays, weekly, or monthly. Default once.
    
- `create_library_folder`: Create a library folder, optionally nested under a parent.

    Args:
        name: Folder name
        parent_id: Parent folder UUID (optional — omit for a root folder)
    
- `create_library_item`: Create a markdown or HTML document in the research library.

    Args:
        title: Document title
        content: Markdown body, or raw HTML when content_type is text/html
        folder_id: Folder UUID (optional — omit for library root)
        content_type: text/markdown (default) or text/html. HTML is stored as source.
    
- `create_portfolio`: Create a portfolio with a name and base currency.

    Args:
        name: Portfolio name
        currency: Base currency (default USD)
    
- `create_screener`: Save a screener filter query for scheduled enter/exit (joiner/leaver) notifies.

    Same rows as Terminal Save on /screener. Pass last_symbols (current matches)
    or call run_screener after create to seed the baseline; later runs notify
    names that enter or leave when Settings Screener in & out is on.

    Args:
        name: Screener name (blank → derived from filters)
        query: Filter blob {universe, fmp, metrics, ai, member?, view?}
        schedule: "off", "daily", or "weekly" (weekly requires Pro)
        notify_on_change: Notify on enter/exit after the first seed (default true)
        last_symbols: Current result tickers to seed the enter/exit baseline
    
- `create_watchlist`: Create a watchlist with the given name and ticker symbols.

    Args:
        name: Watchlist name
        symbols: List of stock symbols (e.g. ["AAPL", "MSFT"])
    
- `delete_alert`: Delete an alert by ID.

    Args:
        alert_id: The alert UUID
    
- `delete_library_folder`: Delete a library folder and everything inside it.

    Args:
        folder_id: The folder UUID
    
- `delete_library_item`: Delete a library document and all of its stored versions.

    Args:
        item_id: The item UUID
    
- `delete_screener`: Delete a saved screener by ID.

    Args:
        screener_id: The screener UUID from list_screeners
    
- `finance_search`: Search financial data and return an answer with an inline widget.

    Covers stocks, macro, forex, crypto, commodities, earnings, technicals,
    and related market questions. Pass the user's question in `query` without
    rephrasing.

    To screen a named watchlist or portfolio, call list_watchlists or
    list_portfolios first, then pass the symbols here with filter criteria in
    `query`.

    Exclusive modes when a Deep Dive exists:
      focus=ai + section=… → narrative section
      focus=raw + source=… → thin data slice
      focus=catalog → list available Deep Dives

    Args:
        query: The user's financial question
        symbols: Optional ticker universe to screen (e.g. from list_watchlists)
        section: Optional Deep Dive section (competition, valuation, thesis,
            forecast, analyst_consensus, people, financials, earnings,
            technicals, overview, moves, markets, flow, calendar, catalysts, odds)
            or raw tapes: options, buzz, acceleration, heatmap.
            Thesis is section=thesis and opens /stock/T/thesis.
            Business is section=competition (/stock/T/competition).
            Price is /stock/T/overview; Large Moves on that tab are section=moves.
            Forecast narrative is section=forecast (/stock/T/analysis).
            Street targets and stance are section=analyst_consensus (/stock/T/valuation).
            Dividends, buybacks, and the alignment / allocation boxes are
            section=financials. There is no Capital section.
            Buzz, social media, reddit, twitter, sentiment, or what people are
            talking about MUST be section=buzz. Do not send those to news or
            catalysts. Consumer sentiment and analyst sentiment are not Buzz.
            Stocks accelerating, price acceleration, speeding up, or speeding
            down MUST be section=acceleration. Do not send those to movers.
            Revenue, earnings, and growth acceleration are not this board.
            Advance/decline, names within 10% of the 52-week high or low, or
            the market P/S, P/E, and P/FCF medians MUST be section=heatmap.
            Do not send those to the sector treemap. One company's P/E is not
            this row.
            One name's options, realized vol, vola, call or put volume, or
            call or put premium MUST be section=options. The 21-day realized
            vol is a yearly rate that places the percentile strikes. A band
            word compares today's session with the prior 20 sessions.
            A press release, presentation, 10-Q, or 10-K for one ticker is
            section=earnings, focus=raw, source=earnings_documents. That is
            not the Earnings write-up.
        focus: Optional exclusive mode: ai | raw | auto | catalog
        source: Optional thin raw slice when focus=raw (comparison_peers,
            price_targets, consensus, quote, key_financials,
            earnings_documents, …)
    
- `get_journal_entry`: Get a full generated journal entry by ID from list_journal.

    Draft ids from submit_journal_draft are not readable until end-of-day
    generation; use list_journal after the daily run for valid entry ids
    (integer or legacy UUID).

    Args:
        entry_id: Journal entry id from list_journal (integer or UUID)
    
- `get_library_item`: Get a library document's metadata and content.

    Content is markdown, raw HTML (content_type text/html), or a signed URL for PDFs.

    Args:
        item_id: The item UUID
    
- `get_notifications`: Get alert notifications. Unread only, unless history is set.

    Args:
        offset: Skip this many rows (default 0)
        limit: Page size (default 50, max 100). Unread upstream cap is 50.
        history: When true, return fired alerts including ones already read, newest first.
    
- `get_portfolio_statistics`: Get portfolio performance statistics (returns, allocation, risk).

    gross_exposure and net_exposure are in book currency. A weight may be
    negative. dividend_income is cash by stock and can be negative when a
    short owes the dividend. total_gain is unrealized_pnl + realized_pnl.
    Do not add dividend_income on top of total_gain.

    Args:
        portfolio_id: The portfolio UUID
    
- `get_positions`: Get current holdings with quantity, cost basis, market value, and unrealized P&L.

    A short has negative shares, a positive avg_cost, a negative total_cost_book
    (the open credit), and a negative market value. Unrealized profit is positive.
    Cash includes short proceeds and is reduced when the short owes a dividend.
    Open cost of a long is already net of dividends still held. Realized P&L
    from closed longs and shorts is on get_portfolio_statistics.

    Args:
        portfolio_id: The portfolio UUID
    
- `list_alerts`: List price, event, and clock alerts for the authenticated user.

    Args:
        offset: Skip this many alerts (default 0)
        limit: Page size (default 50, max 100)
    
- `list_journal`: List generated daily research journal entries (most recent first).

    Entries appear only after the automatic end-of-day journal generation run.
    Drafts from submit_journal_draft are not listed until that run completes.

    Args:
        offset: Skip this many entries (default 0)
        limit: Page size (default 50, max 100). Upstream returns at most 90 days.
    
- `list_library_folders`: List folders in the authenticated user's research library.

    Args:
        offset: Skip this many folders (default 0)
        limit: Page size (default 50, max 100)
    
- `list_library_items`: List documents in a library folder, or at the root if no folder is given.

    Args:
        folder_id: Folder UUID to list (optional — omit for root-level items)
        offset: Skip this many items (default 0)
        limit: Page size (default 50, max 100)
    
- `list_library_item_versions`: List version history for a library document (newest first).

    Args:
        item_id: The item UUID
    
- `list_portfolios`: List the authenticated user's portfolios.

    Args:
        offset: Skip this many portfolios (default 0)
        limit: Page size (default 50, max 100)
    
- `list_screeners`: List the authenticated user's saved screeners (filter queries + schedule).

    Args:
        offset: Skip this many screeners (default 0)
        limit: Page size (default 50, max 100)
    
- `list_watchlists`: List the authenticated user's watchlists and their symbols.

    Args:
        offset: Skip this many lists (default 0)
        limit: Page size (default 50, max 100)
    
- `marketing_graphics`: Admin only. Live formats for one inbox item, or the catalog.

    For a bot, pass content_id from marketing_inbox. Empty options means skip
    the item. Already-rendered images are included so you can reuse a cache hit.

    Args:
        content_id: gc:{id} or rd:{uuid} — live formats for that item
        section: Catalog filter (no content_id)
        language: Catalog filter
        format: Catalog filter
        status: live or draft (catalog only)
    
- `marketing_inbox`: Admin only. Latest teasers plus already-generated images.

    Use ticker for all current items on a symbol, type for one content_type
    across symbols, or since for the worker poll. Then call
    marketing_graphics(content_id) for live formats. Reuse items[].images[]
    when the option you want is already rendered.

    Args:
        since: ISO timestamptz — inbox newer than this
        ticker: Current items for this symbol
        type: allowlisted content_type or research_drop
        limit: 1–200 (default 50)
    
- `marketing_render`: Admin only. Render one live format and wait until image.url exists.

    Blocks until GCS has the PNG (or a cache hit). Do not poll. Draft
    formats return option_not_live.

    Args:
        content_id: gc:{id} or rd:{uuid}
        option_id: live option from marketing_graphics
        force: Bypass render cache
    
- `move_library_folder`: Move a library folder under a different parent (or to root).

    Args:
        folder_id: The folder UUID to move
        parent_id: New parent folder UUID (omit / null for library root)
    
- `move_library_item`: Move a library document into a different folder (or to root).

    Args:
        item_id: The item UUID to move
        folder_id: Destination folder UUID (omit / null for library root)
    
- `rename_library_folder`: Rename a library folder.

    Args:
        folder_id: The folder UUID
        name: New folder name
    
- `report_bug`: Log a bug in the same inbox as the terminal bug button (5 per user per day).

    Use only when the user asks, or when you have confirmed a real data/UI
    error. Do not file speculative bugs. Pass ticker/section so admins get a
    terminal URL; page_url is optional if it is already a terminal.manawa.app link.

    Args:
        description: What is wrong (10–2000 characters)
        ticker: Optional stock symbol the bug is about
        section: Optional tab (overview, financials, thesis, valuation, …)
        page_url: Optional full terminal URL if already known
    
- `run_deepdive`: Queue a full DeepDive suite for a stock using a monthly custom-run grant.

    Prepaid search credits cannot pay for this. Free plans have 0 runs;
    Basic has 10/month; Pro has 50/month. Re-running a ticker already
    unlocked this month does not consume another grant. The call returns
    as soon as the job is queued — do not poll.

    Args:
        ticker: Stock symbol (e.g. "AAPL")
        force: Re-queue every chapter even when a current report exists.
            Use when on-file content is the wrong instrument (e.g. ZS
            Thesis written as soybeans).
    
- `run_screener`: Re-run a saved screener; persist last_symbols; return entered/exited.

    First seed does not notify. Later runs notify joiners and leavers when
    Settings Screener in & out is on. Same path as Terminal Run now.

    Args:
        screener_id: The screener UUID from list_screeners
    
- `search_library`: Full-text search across the authenticated user's library documents.

    Args:
        query: Search terms
        limit: Max results (default 20, capped at 50)
    
- `submit_journal_draft`: Submit a journal draft for a day. Same-day resubmissions are retained as separate drafts.

    The draft is accepted immediately but the readable daily journal entry is
    generated automatically at end of day; it then appears in list_journal.
    The returned draft id is not a list_journal / get_journal_entry id until then.

    Args:
        entry_date: Day the draft is for (YYYY-MM-DD)
        content: Draft text
    
- `update_library_item`: Update a library document's title and/or content (content edits create a new version).

    Content is markdown, or raw HTML when the document is already text/html.
    The document type does not change.

    Args:
        item_id: The item UUID
        title: New title (optional)
        content: New markdown or HTML source (optional)
    
- `update_screener`: Update a saved screener's name, query, schedule, or baseline symbols.

    Args:
        screener_id: The screener UUID from list_screeners
        name: New name (optional)
        query: Updated filter blob (optional)
        schedule: "off", "daily", or "weekly" (optional; weekly requires Pro)
        notify_on_change: Toggle enter/exit notifies (optional)
        last_symbols: Refresh enter/exit baseline from the live table (optional)
    
- `update_watchlist`: Update a watchlist's name and/or symbols.

    Args:
        watchlist_id: The watchlist UUID
        name: New name (optional)
        symbols: Updated list of symbols (optional)
    
