Sodeom MCP

A public, keyless Model Context Protocol server. Any MCP client (Claude, OpenCode, LangChain, custom agents) can search the web through Sodeom — no API key, no signup.

Hosted MCP Server

npx add-mcp 'https://sodeom.com/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

A public, keyless Model Context Protocol server. Any MCP client (Claude, OpenCode, LangChain, custom agents) can search the web through Sodeom — no API key, no signup.

Endpoint

MethodPathDescription
POST/mcpSend one JSON-RPC 2.0 message (or a batch). Returns the response as application/json, or 202 for notifications.
GET/mcp405 — this server never pushes messages, which the spec explicitly allows.
DELETE/mcpEnds a session. Requires the Mcp-Session-Id header (sessions are optional).
GET/.well-known/mcp.jsonDiscovery descriptor pointing at the endpoint.

Transport: Streamable HTTP (MCP 2025-06-18, also accepts 2025-03-26 and 2024-11-05). Base URL for clients: https://sodeom.com/mcp

Client setup

Claude Code

claude mcp add --transport http sodeom https://sodeom.com/mcp

Claude Desktop / any stdio client (via mcp-remote)

{
  "mcpServers": {
    "sodeom": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://sodeom.com/mcp"]
    }
  }
}

OpenCode

{
  "mcp": {
    "servers": {
      "sodeom": { "type": "remote", "url": "https://sodeom.com/mcp" }
    }
  }
}

Python (mcp SDK)

from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client   # mcp >= 2

# mcp 1.x: from mcp.client.streamable_http import streamablehttp_client
#          and unpack as (read, write, _)

async with streamable_http_client("https://sodeom.com/mcp") as (read, write):
    async with ClientSession(read, write) as s:
        await s.initialize()
        print(await s.list_tools())
        out = await s.call_tool("search", {"query": "Flask SSE streaming"})
        print(out.content[0].text)

Tools

ToolArgumentsDescription
searchquery (required), page, languageWeb search (SearXNG + Bing/Brave fallbacks). Numbered title / URL / snippet lines, plus answers and spelling suggestions.
search_newsquery (required), page, languageRecent news articles.
search_videosquery (required), page, languageVideo results (mostly YouTube).
search_imagesquery (required), page, languageImages with direct img_src URLs.
wikiquery (required), languageWikipedia / Wikidata infobox, answer and reference links.
fetch_urlurl (required), max_charsReads a public page and returns its text (scripts stripped, 8000 chars default). Private/internal addresses are refused.

Protocol flow

→ {"jsonrpc":"2.0","id":1,"method":"initialize",
   "params":{"protocolVersion":"2025-06-18","capabilities":{},
             "clientInfo":{"name":"my-agent","version":"1.0"}}}
← {"jsonrpc":"2.0","id":1,"result":{
     "protocolVersion":"2025-06-18",
     "capabilities":{"tools":{"listChanged":false}},
     "serverInfo":{"name":"sodeom","title":"Sodeom Search","version":"1.0.0"},
     "instructions":"..."}}

→ {"jsonrpc":"2.0","method":"notifications/initialized"}      → 202
→ {"jsonrpc":"2.0","id":2,"method":"tools/list"}              → tool schemas
→ {"jsonrpc":"2.0","id":3,"method":"tools/call",
   "params":{"name":"search","arguments":{"query":"python 3.14"}}}
← {"jsonrpc":"2.0","id":3,"result":{
     "content":[{"type":"text","text":"1. Python ..."}],
     "isError":false}}

Raw curl example

curl -s https://sodeom.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"search","arguments":{"query":"Flask"}}}'

Notes

  • No API key — the endpoint is public and read-only.
  • The Mcp-Session-Id header is issued on initialize but never required, so stateless clients work.
  • Tool output is plain text capped at 12 000 characters to keep agent context small.
  • fetch_url refuses private, loopback and link-local addresses.
  • Search answers come from the same backend as /api/search — no tracking, no logging of your queries beyond transient caching.