{
  "markdown": "# Metis MCP\n\nAn MCP server for researching tokenized real-world assets on Solana.\n\nIt gives an assistant twelve tools: six that read chain and market state live,\nand six that reach the research the [Metis](https://metisagent.co) agent has\nalready published. Every figure it returns comes from a fresh read, stamped with\nits source, the time it was taken, and a hash of the raw payload.\n\nThe point is the first question anyone should ask about a tokenized asset and\nalmost nobody can answer quickly: who controls this token, and what happens to\nmy position if they use that control?\n\n## Three ways to connect\n\n**As a plugin.** The easiest path, and the only one that also carries the\nskills. In Claude Code:\n\n```\n/plugin marketplace add metis-rwa/mcp\n```\n\n```\n/plugin install metis@metis-rwa\n```\n\nIn Claude Desktop or on the web, open Customize, then Plugins, then add from a\nrepository with `https://github.com/metis-rwa/mcp.git`. The plugin connects to\nthe hosted endpoint and adds `/metis:due-diligence`, `/metis:premium-watch`,\nand a `token-safety` skill that runs whenever someone asks who controls a\ntoken. See [plugin/README.md](plugin/README.md).\n\n**Hosted, nothing to install.** The same tools are served over HTTP at\n`https://metisagent.co/mcp`:\n\n```bash\nclaude mcp add --transport http metis https://metisagent.co/mcp\n```\n\nThe hosted endpoint answers observation questions from the research agent's own\nstored history, which goes back further than any single machine can. It reads\nonly, needs no key, and holds no session.\n\n**Local, over stdio.** Run the package when you want your own RPC endpoint, your\nown asset list, or history kept on your machine:\n\n```bash\nnpx -y @metisagent/mcp\n```\n\nOr clone and build:\n\n```bash\ngit clone https://github.com/metis-rwa/mcp.git\ncd mcp\nnpm install\nnpm run build\nnode dist/index.js\n```\n\nThe server speaks MCP over stdio.\n\n## Connect the local server\n\nClaude Code:\n\n```bash\nclaude mcp add metis -- npx -y @metisagent/mcp\n```\n\nClaude Desktop, in `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"metis\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@metisagent/mcp\"],\n      \"env\": {\n        \"SOLANA_RPC_URL\": \"https://your-endpoint.example/rpc\"\n      }\n    }\n  }\n}\n```\n\nAny other MCP client works the same way: run `metis-mcp` (or\n`node dist/index.js`) and speak MCP on stdin and stdout.\n\n## Tools\n\nOn-chain checks:\n\n| Tool | What it answers |\n| --- | --- |\n| `list_rwa_assets` | Which assets this server knows by symbol, and their mints |\n| `get_token_controls` | Can the issuer mint, freeze, seize, pause, or gate transfers |\n| `get_token_supply` | How many tokens exist, and whether supply is capped |\n| `get_holder_concentration` | Who holds the supply, and is any of it frozen |\n| `get_token_market` | How deep the liquidity is, pool by pool |\n| `get_reference_premium` | Is the token trading away from the security it tracks |\n\nResearch:\n\n| Tool | What it answers |\n| --- | --- |\n| `observe_asset` | One full research cycle: read everything, compare against history, report detections and confidence |\n| `get_observation_history` | What this server has recorded for the asset so far, and the trend |\n| `list_research` | What the Metis agent has published, filtered by asset or category |\n| `get_research` | The full object behind one publication: claims, evidence, methodology, provenance |\n| `get_research_status` | What the agent is investigating right now, and source health |\n| `check_sources` | Which data sources are answering, and how fast |\n\nEvery tool takes either a registry symbol (`TSLAx`) or a raw Solana mint\naddress, so assets outside the registry work too.\n\nThe registry ships with the 72 xStocks on Solana, from `AAPLx` through `XOMx`,\nincluding the index and commodity fund shares (`SPYx`, `QQQx`, `GLDx`, `PPLTx`,\n`TBLLx`) and the private-market listings (`SPCXx`, `VCXx`). Filter it with\n`list_rwa_assets`, by substring or by asset type.\n\nTwo prompts ship with the server: `rwa_due_diligence` walks an asset through\ncontrols, supply, concentration, depth, and premium, and `premium_watch` reads a\nprice gap against stored history. Two resources are exposed as well:\n`metis://registry` and `metis://methodology`.\n\n## What `get_token_controls` is for\n\nA tokenized equity is a claim on something held off chain, so the issuer keeps\npowers a plain token does not have. Token-2022 makes those powers explicit on\nthe mint, and this tool translates each one into what it means for a holder:\n\n- **Permanent delegate**: tokens can be moved or burned out of any account\n  without the holder signing.\n- **Freeze authority**: any account can be frozen, which blocks selling and\n  redemption.\n- **Transfer hook**: every transfer runs through a program that can reject it,\n  which is how an allowlist is enforced.\n- **Default account state frozen**: new accounts cannot transact until the\n  issuer thaws them, so the token is permissioned by default.\n- **Pausable**: transfers can be halted chain-wide.\n- **Scaled UI amount**: displayed balances are rescaled, which is how splits\n  and similar corporate actions land on chain.\n\nNone of these are defects. Redeemable backed assets need most of them. They are\nsimply facts about the asset that belong in any answer about whether it is worth\nits reference price.\n\n## Configuration\n\n| Variable | Default | Purpose |\n| --- | --- | --- |\n| `SOLANA_RPC_URL` | a public node | Solana JSON-RPC endpoint |\n| `METIS_API_URL` | `https://metisagent.co` | Metis research API |\n| `METIS_ASSETS_FILE` | none | JSON file of extra assets to register |\n| `METIS_MCP_STATE_DIR` | `~/.metis-mcp` | Where observation history is stored. Set to `off` for memory only |\n| `METIS_MCP_TIMEOUT_MS` | `20000` | Network timeout per request |\n\nSet `SOLANA_RPC_URL` to an endpoint you control if you can. Public nodes\nthrottle the heavier reads, and `get_holder_concentration` is the first one they\nrefuse.\n\n`METIS_ASSETS_FILE` takes an array. Only `symbol` and `mint` are required:\n\n```json\n[\n  {\n    \"symbol\": \"AAPLx\",\n    \"name\": \"Apple xStock\",\n    \"mint\": \"<mint address>\",\n    \"decimals\": 8,\n    \"assetType\": \"tokenized_equity\",\n    \"referenceTicker\": \"AAPL\",\n    \"issuerName\": \"Backed Assets\"\n  }\n]\n```\n\nVerify a mint against the chain before adding it. A wrong address returns\nconfident, wrong answers. Everything already in the registry was read back from\nSolana first: the names and symbols in `src/assets.ts` are the ones written into\neach mint's own Token-2022 metadata, not labels copied from a token list. Check\nthem again at any time:\n\n```bash\nnpm run verify-assets\n```\n\n## How an observation cycle works\n\n`observe_asset` reads supply and holder concentration from Solana, pooled\nliquidity and volume from DEX venues, and the token and reference prices from a\npublic price service. It compares the result against the observations already\nstored for that asset, then reports:\n\n- **Observations**: what is true right now, each tied to the reads behind it.\n- **Detections**: metrics that crossed a threshold, with the baseline they\n  crossed it against.\n- **Conflicts**: sources that disagree, recorded rather than averaged away.\n- **Confidence**: computed from source coverage, source failures, cross-source\n  agreement, and how much history backs the comparison. A model's own stated\n  confidence is never an input.\n\nHistory lives on the machine running the server. The first call on an asset has\nno baseline, so only the premium threshold can fire. Call it again over time and\nsupply, liquidity, activity, and concentration detections come alive. The hosted\nendpoint skips that warm-up entirely: it compares against the history the\nresearch agent has been recording every ten minutes since it went live.\n\n## Limits worth stating\n\n- Largest token accounts are accounts, not beneficial owners. Pools, bridges,\n  and custodial accounts sit at the top of most lists.\n- DexScreener refuses datacenter traffic. Run the server from a laptop and it\n  answers; run it from a cloud host and pool data falls back to the price\n  service, which reports liquidity, 24h volume, and a holder count but no pool\n  breakdown and no transaction counts. Tools say when a number came from the\n  standby.\n- A republished reference price can be stale outside market hours, and that\n  alone can look like a premium.\n- Aggregated venue data covers listed pools. Anything traded over the counter\n  or internally is invisible here.\n- This is informational research produced by software. It is not financial\n  advice, and it can be wrong.\n\n## Development\n\n```bash\nnpm install\nnpm run typecheck\nnpm test\nnpm run inspector\n```\n\nTests cover the analysis rules, the control translations, the registry, and the\nhistory store. They run against the build, so `npm test` builds first.\n\n## Releasing\n\nThe package publishes to npm as `@metisagent/mcp`, and `server.json` describes it\nfor the MCP registry. The registry proves ownership by matching `mcpName` in\n`package.json` against the server name in `server.json`, so those two strings\nhave to stay in step.\n\n1. Bump the version in `package.json` and in both places in `server.json`, then\n   add a `CHANGELOG.md` entry.\n2. `npm run verify-assets` to confirm the registry still matches the chain.\n3. `npm test`.\n4. `npm publish --access public`.\n5. `mcp-publisher login github` then `mcp-publisher publish` to list the release\n   in the MCP registry.\n\n## License\n\nMIT\n",
  "bytes": 9388,
  "sha": "31ac6ad93ff86bd6c1d2676479d50f3a96834cd1f3208c1887016cdd1e5d6774",
  "repo_slug": "metis-rwa/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_metis_rwa_mcp_eaae23f0/readme"
}