Skip to the page

ILTER

Register SpecStream in ILTER's MCP gateway, and ILTER adds live web search, page reading and Deep Search tools to the chat completion requests that pass through it, then runs the tool calls the model makes. ILTER starts SpecStream's stdio bridge as a subprocess.

SpecStream for ILTERAgent frameworks & builders

What you need

  • ILTER run from its release binary on a host with Python 3.12 or newer, with its admin key (ILTER_ADMIN_API_KEY).
  • A SpecStream account. New accounts start with $10 of credit, no card. Create one.
  1. 1. Install the stdio bridge on the ILTER host

    ILTER reaches upstream MCP servers over stdio or SSE. SpecStream's server at https://api.specstream.ai/mcp speaks Streamable HTTP, so ILTER runs specstream-mcp-stdio, a small proxy with no dependencies that forwards each call to that address on your key. Install it where ILTER runs:

    ILTER host
    pip install specstream-mcp-stdio
  2. 2. Put a SpecStream key in ILTER's environment

    In SpecStream, open Agents & API, choose API keys, then Create API key, and give it a total spending limit above 0. Every request through ILTER spends from this key, so its limit is the ceiling for all of them.

    ILTER starts a stdio server with its own environment, so set the key where ILTER starts and restart it:

    ILTER host
    export SPECSTREAM_API_KEY="YOUR_SPECSTREAM_API_KEY"
    ./ilter serve
  3. 3. Register the server through the admin API

    Post the server to /api/mcp-servers on the dashboard port, 9191, with ILTER's admin key as a Bearer token. ILTER's configuration doc lists this section as /api/mcp/servers; the route the server answers, and the dashboard calls, is /api/mcp-servers.

    transport is stdio and command is specstream-mcp-stdio. ILTER looks the command up on its PATH, so give the full path, such as the output of which specstream-mcp-stdio, if it is not there. args and env are JSON written as strings. Send "enabled": true, or ILTER skips the server at its next start. timeout_ms defaults to 30,000; 60,000 gives a 20 page read room to finish:

    Terminal
    curl -X POST http://localhost:9191/api/mcp-servers \
    -H "Authorization: Bearer $ILTER_ADMIN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "id": "specstream",
    "name": "SpecStream",
    "transport": "stdio",
    "command": "specstream-mcp-stdio",
    "args": "[]",
    "env": "{\"SPECSTREAM_MCP_URL\": \"https://api.specstream.ai/mcp\"}",
    "enabled": true,
    "timeout_ms": 60000
    }'
  4. 4. Sync the tools

    Send POST /api/mcp-servers/specstream/test with the same admin key: ILTER starts the bridge and returns its status and tools_count. Then POST /api/mcp-servers/specstream/sync, or click Sync on SpecStream's row on the MCP Servers page, reads the tool list: search_web, read_pages and the Deep Search tools such as compile and quote_capacity_work. Keep the MCP toggle beside Add Server on that page on, or ILTER adds no MCP tools to requests.

  5. 5. Send a request through ILTER

    Call ILTER's proxy on port 8181 as you do today. ILTER adds SpecStream's tools to the request, runs the tool_call the model returns, and gives the result back to the model, with no change in your client:

    Terminal
    curl -X POST http://localhost:8181/v1/chat/completions \
    -H "Authorization: Bearer <ilter-api-key>" \
    -H "Content-Type: application/json" \
    -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "What is the latest stable release of PostgreSQL? Search the web."}]
    }'

Or add it in the dashboard

Open the dashboard on port 9191 (http://localhost:9191), go to MCP Servers and click Add Server. Set Server Name to SpecStream, Transport to STDIO (Subprocess) and Command to specstream-mcp-stdio, and leave Args empty. Under Environment Variables, click Add Variable and set SPECSTREAM_MCP_URL to https://api.specstream.ai/mcp. Click Add Server.

The form saves the server with enabled off, and ILTER skips a disabled server when it next starts. Send PATCH /api/mcp-servers/specstream/toggle once with the admin key to turn it on; the reply's enabled should be true.

Who gets the tools

ILTER's default MCP policy is allow, so every key gets every SpecStream tool unless a grant says otherwise, and a deny grant wins over an allow. To keep a key, user or group away from SpecStream, click Access on its row, and under Add Grant add a deny grant for that subject. A grant's tools can be * or a JSON list of tool names, so a deny grant on ["authorize_capacity_work"] keeps a key to search and reading: Deep Search runs start only through that tool.

What the model gets back

search_web takes {"q": "<the question>"} and returns an answer with the page it was read from, and the sources it read, each with url, title, site and snippet. read_pages takes {"urls": ["<url>", ...]}, up to 20, and returns each page's main text as Markdown. Deep Search tools quote a price first and start nothing until the approved maximum comes back in confirm_max_cents.

With Docker

ILTER's official image is built on an empty scratch base with only the binary, CA certificates and time zones, so it has no Python for the bridge. Run the release binary on a host with Python 3.12, or build your own image that adds Python and specstream-mcp-stdio.

Cost

Registering SpecStream in ILTER is free. Each search_web call is one Search API call at $5 per 1,000 searches of up to 10 results, and each page read_pages reads is $0.80 per 1,000 pages; a page with no text is not charged. Both come out of the balance with no quote and no approval, within the key's spending limit. Deep Search is priced per row, and nothing runs until its quote is approved. Search API, Extract API and billing.

Remove

Delete SpecStream on ILTER's MCP Servers page, or send DELETE /api/mcp-servers/specstream. Revoke the key in SpecStream's Agents & API to end its access at once. Every tool on the server is described in the agent guide. Questions go to [email protected].

More

SpecStream for ILTER covers what it does in ILTER on one page. Every other tool has its guide in Connect your tools. You see the most a request can cost before it starts, and the matches are paid from your balance. Billing has the details. For help, email [email protected].