summarize_url
Fetch a URL, extract clean article text, and return an N-bullet summary.
urlrequiredn_bullets
io.github.wzltmpPublished by GitHub account wzltmpv0.1.0Updated Nov 2, 2026
Summarize URLs, repurpose content, daily news digests, find competitors. Cost telemetry built in.
Remote MCP server with four LLM-backed content tools: URL summarization, content repurposing, news digests and competitor lookup.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/io.github.wzltmp%2Fmcp-automations/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Add this to your client's mcpServers config.
{
"mcpServers": {
"automations": {
"type": "http",
"url": "https://mcp-automations.fly.dev/mcp"
}
}
}A production-grade Model Context Protocol server in Python — four LLM-callable tools, two transports, deployed two different ways.
Most "AI engineer" portfolio projects are applications (a RAG chatbot, an agent that does research). This project is the layer underneath — the typed tools an LLM can call and the transport plumbing that exposes them. MCP is the emerging standard for LLM tool use (~97M monthly SDK downloads as of early 2026); building one — not just consuming one — is the rare skill.
For a deeper look at the design decisions — why two transports, how cost telemetry works, the exception hierarchy, what I'd do differently — see WRITEUP.md.
Plus one MCP resource (automations://catalog) and one MCP prompt (daily_brief) — using all three MCP primitives, not just tools.
Every tool returns a typed Pydantic model with per-call token usage and dollar cost attached. Cheap tasks route to Haiku 4.5 ($1/M in, $5/M out), writing-heavy tasks to Sonnet 4.6 ($3/M in, $15/M out).
Add one of these to ~/Library/Application Support/Claude/claude_desktop_config.json (Mac) or %APPDATA%/Claude/claude_desktop_config.json (Windows), then restart Claude Desktop.
Option A — local stdio (no network, runs the server as a subprocess):
Option B — remote HTTP (talks to the live Fly server, no local setup):
Then ask Claude something like "summarize https://www.paulgraham.com/greatwork.html in 3 bullets" — it'll call summarize_url automatically.
Requires Python 3.13. Needs ANTHROPIC_API_KEY and TAVILY_API_KEY in .env (see .env.example).
The same Python callables back all three entry points. The transport is just a wrapper.
models.Cost) — token counts and USD attached so a client doesn't have to re-derive it.UpstreamAPIError, EmptyLLMResponseError, ExtractionError each route differently in logs and the Streamlit UI.MCP_TRANSPORT=stdio|http env switch; HTTP host/port from env so the same image runs on Fly..github/workflows/ci.yml).MCP is transport-agnostic, so one server serves both a local Claude Desktop user (stdio subprocess) and a hosted multi-tenant deployment (HTTPS). It also exposes three primitives that most demos skip:
automations://catalog returns the tool list as JSON)daily_brief chains daily_digest + repurpose_content)Using all three is a signal of reading the spec, not just a quickstart.
✅ Code on GitHub, CI green
✅ Public playground on Streamlit Cloud
✅ Public MCP HTTP server on Fly.io
✅ Cost protection (per-session caps + monthly Anthropic cap)
✅ Real test coverage (23 offline unit tests)
✅ Listed on the Official MCP Registry as io.github.wzltmp/mcp-automations
✅ Long-form writeup of design decisions
✅ Consumed by another agent, not just demoed — langgraph-research-agent's read_node calls this server's summarize_url tool over HTTP (with local fallback if the call fails)
🚧 Demo gif + screenshots (planned)
🚧 n8n self-host via docker-compose (planned)
MIT.
Source: README.md at commit b8c9b1d
Fetch a URL, extract clean article text, and return an N-bullet summary.
urlrequiredn_bulletsRepurpose long-form text into ``twitter_thread``, ``linkedin_post``, or ``newsletter``.
textrequiredformatSearch the web for recent news on ``topic`` and return a digest with citations.
topicrequiredn_resultsIdentify ``n`` plausible competitors for a company at ``domain`` (e.g., 'stripe.com').
ndomainrequired100% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
# 30-second proof the server is up:curl -X POST https://mcp-automations.fly.dev/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","method":"initialize","id":1, "params":{"protocolVersion":"2024-11-05", "capabilities":{}, "clientInfo":{"name":"curl","version":"1"}}}'{ "mcpServers": { "mcp-automations": { "command": "python", "args": ["-m", "mcp_server.server"], "cwd": "/absolute/path/to/mcp-automations", "env": { "ANTHROPIC_API_KEY": "sk-ant-...", "TAVILY_API_KEY": "tvly-..." } } }}{ "mcpServers": { "mcp-automations": { "url": "https://mcp-automations.fly.dev/mcp", "transport": "http" } }}pip install -r requirements.txt
# Stdio (for Claude Desktop):python -m mcp_server.server
# HTTP server (defaults to 0.0.0.0:8765):MCP_TRANSPORT=http python -m mcp_server.server
# Streamlit playground:streamlit run playground/app.py┌────────────────┐ stdio ┌──────────────────────┐│ Claude Desktop ├───────────────►│ │└────────────────┘ │ │ │ mcp_server/ │┌────────────────┐ HTTP/JSON │ server.py ││ Remote client ├───────────────►│ (FastMCP) │└────────────────┘ (Fly.io) │ │ │ 4 tools │┌────────────────┐ direct call │ 1 resource ││ Streamlit UI ├───────────────►│ 1 prompt │└────────────────┘ └──────────┬───────────┘ │ ┌──────────┴───────────┐ │ Anthropic + Tavily │ │ (lazy clients) │ └──────────────────────┘mcp-automations/├── mcp_server/│ ├── server.py # FastMCP server: 4 tools + 1 resource + 1 prompt│ ├── models.py # Pydantic I/O schemas (incl. per-call Cost telemetry)│ └── exceptions.py # MCPToolError + UpstreamAPIError / EmptyLLMResponseError / ExtractionError├── playground/│ └── app.py # Streamlit UI with per-session call + spend caps├── tests/ # offline unit tests (httpx/anthropic/tavily all mocked)├── Dockerfile # python:3.13-slim, MCP_TRANSPORT=http for Fly├── fly.toml # shared-cpu-1x, 256mb, auto-stop when idle└── .github/workflows/ # ruff + strict mypy + pytest on every push