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
| Method | Path | Description |
|---|---|---|
POST | /mcp | Send one JSON-RPC 2.0 message (or a batch). Returns the response as application/json, or 202 for notifications. |
GET | /mcp | 405 — this server never pushes messages, which the spec explicitly allows. |
DELETE | /mcp | Ends a session. Requires the Mcp-Session-Id header (sessions are optional). |
GET | /.well-known/mcp.json | Discovery 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
| Tool | Arguments | Description |
|---|---|---|
search | query (required), page, language | Web search (SearXNG + Bing/Brave fallbacks). Numbered title / URL / snippet lines, plus answers and spelling suggestions. |
search_news | query (required), page, language | Recent news articles. |
search_videos | query (required), page, language | Video results (mostly YouTube). |
search_images | query (required), page, language | Images with direct img_src URLs. |
wiki | query (required), language | Wikipedia / Wikidata infobox, answer and reference links. |
fetch_url | url (required), max_chars | Reads 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-Idheader is issued oninitializebut never required, so stateless clients work. - Tool output is plain text capped at 12 000 characters to keep agent context small.
fetch_urlrefuses 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.