MCP — Internal Use

Miso runs a Model Context Protocol (MCP) server. It lets an AI assistant — Claude, an IDE agent, or your own tool-calling application — search your content and read the full text of what it finds.

This page covers the internal setup: one credential for your whole app, shared by your own team or one application you control.

To let each of your subscribers connect their own AI agent with their own login, see MCP Server for your Subscribers. The tools below are the same in both setups.

The assistant gets two tools:

  1. A search tool, named for your brand. It returns short snippets from many articles at once.
  2. A detail tool. It returns the full text of one snippet.

This two-step design keeps the assistant's context small. The assistant scans many short results first. Then it reads in full only what it needs.

Availability. Miso enables MCP per app and issues your token. To turn it on, contact your Miso representative.


Connect

Your MCP server URL looks like this:

https://api.askmiso.com/v1/ask/mcp?api_key=YOUR_KEY&token=YOUR_MCP_TOKEN

Miso gives you both values. Use your publishable API key. The MCP token is the access gate.

The transport is Streamable HTTP with JSON-RPC 2.0. Most clients call this "HTTP".

Claude Desktop

Open Settings ▸ Connectors ▸ Add custom connector. Paste the full server URL.

Claude Code

claude mcp add --transport http miso \
  "https://api.askmiso.com/v1/ask/mcp?api_key=YOUR_KEY&token=YOUR_MCP_TOKEN"

Add --scope project to write the server into a .mcp.json file that you can commit. Add --scope user to keep it private to your machine.

Cursor, VS Code, and Windsurf

Add this to your mcp.json:

{
  "mcpServers": {
    "miso": {
      "type": "http",
      "url": "https://api.askmiso.com/v1/ask/mcp?api_key=KEY&token=TOKEN"
    }
  }
}

Clients that support stdio only

Some clients cannot speak HTTP directly. Bridge them with mcp-remote:

npx mcp-remote https://api.askmiso.com/v1/ask/mcp \
  --header "Authorization: Bearer YOUR_MCP_TOKEN-YOUR_KEY"

Authentication formats

You can authenticate in either of two ways.

Method How
Combined header Authorization: Bearer <MCP_TOKEN>-<API_KEY>
Separate values X-API-Key and X-MCP-Token headers, or the api_key and token query parameters

The combined header is the simplest form, and most MCP clients expect it. Use the query-parameter form for clients that cannot set headers.

Both values are always required. If the token does not match the one Miso issued for your app, the server returns 401.


The search tool

Miso names this tool for your brand, for example ask_yourbrand. Your Miso representative confirms the exact name.

Parameter Type Required Notes
question string yes The question to search for.
context string no What the user is working on. Miso adds it to the question.
skill_used string no The name of the skill or template that made the call. Used for analytics only.
author string no Restrict results to one author. Available only if Miso enables it for your app.

The parameter is question, not query. A wrong name returns an error.

The author filter is fuzzy. Partial names, any casing, and small trailing typos all match. But the first letters must be correct. The response reports which author names matched.

There is no parameter for result count, paging, or filtering. Miso scopes the search to your catalog on the server side.

What search returns

{
  "query": "interest rate cuts",
  "results": [
    {
      "product_id": "art-20260612-rates",
      "product_title": "Central bank signals 2026 cuts",
      "authors": "A. Reporter",
      "offset": 1,
      "snippet_preview": "The central bank said it expects two cuts...",
      "published_date": "2026-06-12",
      "url": "https://example.com/markets/rates",
      "relevance_score": 0.87
    }
  ],
  "citation_format": "Use markdown links: [product_title](url) by authors"
}
Field What it is
product_id Pass this to the detail tool.
offset Pass this to the detail tool. A negative value means a whole-work match.
snippet_preview The first 300 characters, cut on a sentence boundary.
relevance_score A score from 0 to 1.
url The citation link.
published_date Present when the article has a date.
child_title The chapter or section, when there is one.
matched_authors Present when you use the author filter.

If nothing matches, results is empty and the response carries a message.


The detail tool

The default name is get_snippet_detail. Miso can rename it for your brand.

Parameter Type Required Notes
product_id string yes From a search result.
offset integer yes From the same search result.
skill_used string no Analytics only.

Call the search tool first. The detail tool only accepts a product_id and offset that a search returned. Any other value is refused, and Miso records the attempt. A result stays readable for one hour after the search that found it. See Protecting your content.

What the detail tool returns

{
  "product_id": "art-20260612-rates",
  "product_title": "Central bank signals 2026 cuts",
  "authors": "A. Reporter",
  "offset": 1,
  "content": "The full text of the snippet...",
  "url": "https://example.com/rates",
  "citation_format": "[Central bank signals cuts](https://ex.com/r)",
  "citation_instruction": "ALWAYS cite using the markdown link."
}

The citation_format field holds a ready-made markdown link. The assistant is told to cite with it, so the reader can click straight through to your article.


Test the connection

Send three JSON-RPC calls: initialize, tools/list, then tools/call. Replace the tool name with your own.

BASE=https://api.askmiso.com/v1/ask/mcp
AUTH="Authorization: Bearer YOUR_MCP_TOKEN-YOUR_KEY"
CT="Content-Type: application/json"

# 1. initialize
curl -X POST "$BASE" -H "$AUTH" -H "$CT" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize",
        "params": {} }'

# 2. list the tools
curl -X POST "$BASE" -H "$AUTH" -H "$CT" \
  -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }'

# 3. run a search
curl -X POST "$BASE" -H "$AUTH" -H "$CT" \
  -d '{ "jsonrpc": "2.0", "id": 3, "method": "tools/call",
        "params": { "name": "ask_yourbrand",
                    "arguments": { "question": "Rate outlook?" } } }'
const BASE = "https://api.askmiso.com/v1/ask/mcp";
const HEADERS = {
  Authorization: `Bearer ${MCP_TOKEN}-${API_KEY}`,
  "Content-Type": "application/json",
};

async function rpc(method, params = {}, id = 1) {
  const res = await fetch(BASE, {
    method: "POST",
    headers: HEADERS,
    body: JSON.stringify({ jsonrpc: "2.0", id, method, params }),
  });
  return res.json();
}

await rpc("initialize");
const tools = await rpc("tools/list", {}, 2);
const hit = await rpc("tools/call", {
  name: "ask_yourbrand",
  arguments: { question: "What changed in the rate outlook?" },
}, 3);
import requests

BASE = "https://api.askmiso.com/v1/ask/mcp"
HEADERS = {
    "Authorization": f"Bearer {MCP_TOKEN}-{API_KEY}",
    "Content-Type": "application/json",
}

def rpc(method, params=None, id=1):
    body = {"jsonrpc": "2.0", "id": id, "method": method,
            "params": params or {}}
    return requests.post(BASE, headers=HEADERS, json=body).json()

rpc("initialize")
tools = rpc("tools/list", id=2)
hit = rpc("tools/call", {
    "name": "ask_yourbrand",
    "arguments": {"question": "What changed in the rate outlook?"},
}, id=3)

tools/list shows the two tools available to your app. If the search tool is missing, MCP is not yet enabled for your key.


Protecting your content

An MCP server gives an AI assistant access to your archive. Miso controls that access at four levels.

Snippets are not addressable

This is the main protection. The detail tool does not accept any product_id you choose. It only returns a snippet that a search already returned to you, and only for one hour after that search.

The result:

  • Nobody can enumerate your catalog by guessing or incrementing ids.
  • Nobody can walk through a whole article by stepping the offset.
  • Every full-text read must follow a real search that surfaced that exact passage.
  • Access to a passage expires one hour after the search that found it.

Bulk extraction therefore needs thousands of genuine searches. Each one is slow, is charged, and is recorded.

Miso records every refused read as well as every successful one. A client that probes for content it was never shown is visible in your usage data. See Usage and analytics.

Requests from data centers are blocked

Miso blocks traffic from cloud and hosting providers, from known scraper networks, and from selected regions. This stops most scripted extraction, because that traffic rarely comes from a home or office connection.

Rate limits and IP restrictions

Miso can cap how many MCP calls your app accepts, and can restrict MCP access to your own IP ranges. Both are useful when only your staff or one internal application uses the server. Contact your Miso representative to set them up.

Your credentials control access

Both an API key and your app's MCP token are required, and the token is specific to your app. If a credential leaks, ask Miso to rotate the token. Every client that uses it loses access immediately.

Treat the server URL as a secret. It carries both values.


Usage and analytics

Miso records every MCP call. Ask your Miso representative for a report, or for access to the usage data.

What Miso records

Call What is stored
Search The question, the optional context and author, the skill_used tag, and how long the call took.
Full-text read The article id, the passage offset, whether the read was allowed, the size of the passage served, and a short excerpt of it.

Miso stores the length and a short excerpt of each passage it serves, not the whole passage.

What you can measure

  • Volume. Searches and full-text reads per day, and the trend over time.
  • What people ask. The questions assistants send to your content.
  • The read-through funnel. Miso links each full-text read back to the search that surfaced it. You can therefore measure how many searches lead to a read, and how many results an assistant reads per search.
  • Which content gets used. The articles that assistants read most, and how much of each one they read.
  • Refused reads. Attempts to fetch a passage that no search returned. A rise here suggests someone is probing your archive.
  • Speed. How long searches take for your catalog.

Tag your own traffic

Pass skill_used on any call to label where it came from — a named workflow, a prompt template, or one internal application. Miso records the value, so you can split your usage report by it.

{
  "name": "ask_yourbrand",
  "arguments": {
    "question": "What changed in the rate outlook?",
    "skill_used": "morning-briefing"
  }
}

One limitation

MCP reporting is per app, not per person. MCP clients do not send an end-user identity, so Miso cannot break usage down by seat or by reader. If you need per-user reporting, talk to your Miso representative about the options.


Notes and limits

  • Errors return HTTP 200. JSON-RPC reports failures in the response body, not in the status code. Read the error field, and read isError on a tool result.
  • Both tools are read-only. They carry the read-only annotation, so clients can let a user approve them once.
  • Search takes a few seconds. Half of searches complete in about 6 seconds. Reading a snippet is almost instant.
  • Results are scoped to your catalog. The assistant cannot reach content outside it.
  • One URL serves every brand. Your API key decides which brand's tool appears, so keep your key and token together.