CommunityCoding & Developmentgithub.com

2016judea/mcp-stack

Which free MCP server or framework to reach for, and its traps — finance/gov data (SEC EDGAR, Yahoo, SAM.gov, USAspending), web research (Exa, Firecrawl, Crawl4AI, Jina reader), design/art/brand (Canva, Inkscape, Penpot, Figma, Orshot, Hugging Face image gen, vectorizing, charts), data/spatial (DuckDB spatial, live ArcGIS layers, OpenStreetMap/Overpass, Census, MapLibre), and ops (PostHog, iMessage, context7 docs). Use when making a social post, OG card, poster, logo/vector, chart, map, or brand asset; when querying parquet/geojson/duckdb or a city's open-data layer; when an MCP "needs authentication" or fails; or when asked "what tools do we have", "is there an MCP for X", "should we add X".

What is mcp-stack?

mcp-stack is a Claude Code agent skill that which free MCP server or framework to reach for, and its traps — finance/gov data (SEC EDGAR, Yahoo, SAM.gov, USAspending), web research (Exa, Firecrawl, Crawl4AI, Jina reader), design/art/brand (Canva, Inkscape, Penpot, Figma, Orshot, Hugging Face image gen, vectorizing, charts), data/spatial (DuckDB spatial, live ArcGIS layers, OpenStreetMap/Overpass, Census, MapLibre), and ops (PostHog, iMessage, context7 docs). Use when making a social post, OG card, poster, logo/vector, chart, map, or brand asset; when querying parquet/geojson/duckdb or a city's open-data layer; when an MCP "needs authentication" or fails; or when asked "what tools do we have", "is there an MCP for X", "should we add X".

Works with✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/2016judea/brick-mortar-skills/tree/HEAD/skills/mcp-stack

Installed? Explore more Coding & Development skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

The MCP stack

A field guide from a bake-off where every server was run on the same real jobs (a 1080x1350 social post in a riso house style; real spatial questions checked by an independent query). Free tiers only.

Rule: free only. Never upgrade, start a billing trial or enter a card on any of these without the owner saying so. A paywall is a finding, not a purchase.

Rule: nothing publishes. Orshot has a publish param that posts to social; Canva and Figma can share. Never pass them unasked. Output is a local file a human reviews.

Design / art / brand — pick by job

JobUseWhy / cost
Finished marketing piece from a brief, best-lookingcanva create-design -> resize-design -> export-designBest-looking output of the set. ~6 AI designs/month free (one design = ~15% of quota; resets monthly). Edit with edit-design rather than regenerate.
Riso post / card / poster, unlimited, exact numbersinkscape MCP inkscape_vector construct_svg (params.header + params.body) -> inkscape_render export_previewRenders real halftone patterns, feTurbulence grain, multiply overprint, misregistration. ~5s, headless, unlimited. Default for anything repeatable; keep your SVG body as a template file.
Precise vector layout in a design filepenpot execute_code -> export_shapeFree, unlimited. A Penpot tab with the file must be open (headless OK) or every call fails.
Same, but in Figma for someone to pick upfigma create_new_file + use_figmaFree Starter = ~20 counted calls/month, 3 files. Budget it. No createImageAsync/setPluginData.
Reusable template with variables (OG card, IG post series)orshot~100 renders/month free. Shape colour goes in style.fill (backgroundColor paints black). Output URLs are public-unguessable.
AI illustration draft, freehuggingface dynamic_space -> mcp-tools/Qwen-Image, aspect_ratio:"3:4"Closest to riso of the free models. ~6 images/day (ZeroGPU quota). 1.6MP; paints fake signature scribbles in corners — crop. Finals go to a paid engine (make-art).
Transparent PNG cutouthuggingface space_name: Upsampler/birefnet-background-removal, {"image":"<public URL>"}~5s. Spaces take public URLs only, never local paths.
Colour raster -> SVG (logos, marks)shapesoda vectorize {image_base64, image_type:"artwork", colors:8, format:["svg"]}~10/day free. Download link expires in 24h — fetch immediately. Strip stray #ff00ff paths at cutout edges. Render the SVG at 4x = free upscale for flat art.
One-ink SVG (stamp, stencil, keyline plate)svg-tracer trace_bitmap_to_svg (absolute paths)Local potrace, unlimited, 0.1s.
Chart from real numbersantv-chartHand-drawn texture option. Sends your data to a third-party render service and returns a public URL — public numbers only. Empty x-axis title prints "category".
3D type / product mockupBlender MCP (needs the app running)Launch Blender with the add-on, then add the server ad hoc (uvx mcp-for-blender@<pinned>) with DISABLE_TELEMETRY=true. Telemetry is ON by default — always disable.
Raster finishing (newsprint halftone, photo edit)GIMP MCP (needs gimp-console running)For GIMP 3.2 headless: gimp-console -i --batch-interpreter=python-fu-eval -b "p=Gimp.get_pdb().lookup_procedure('plug-in-mcp-server'); c=p.create_config(); c.set_property('run-mode', Gimp.RunMode.NONINTERACTIVE); p.run(c)" &. Newsprint defaults to lines — set circle. Hex colours only. Kill gimp-console after.
HTML -> PNG card, nothing leaves the machineSatori MCP, patchedThe stock version uploads every image to public blob storage; patch it to save locally. Install with a frozen lockfile.

Every number on a piece comes from the live source (curl it), never typed. Contrast-check accent colours on light grounds (a mid red on cream can be ~3.8:1, which fails small text; darken it under ~24px).

Dropped (don't re-test): Pollinations (watermark, low res), Stability (one-time trial), fal/Replicate/Together (no card-free tier), Krita MCP (no text), tldraw and Excalidraw MCP apps (draw only inside a chat UI), Bannerbear/Placid (trials), Postiz (no free cloud, needs Docker), Remotion MCP (docs only), Buffer (signup CAPTCHA).

Data / spatial

JobUseTraps
SQL + spatial over parquet/csv/geojson/.duckdbduckdb MCP (in-memory, spatial loaded)ST_Transform(ST_Point(lon,lat),'EPSG:4326','EPSG:26915') returns POINT(inf inf) silently, so distance filters count 0. Pass always_xy := true. Assessor columns are often VARCHAR (max sorts as text); sale prices can carry a 999,999,999 placeholder. If the server runs read-write it can COPY TO anywhere: attach your real files READ_ONLY.
Live ArcGIS FeatureServer layerduckdb ST_Read('<FeatureServer>/0/query?where=...&outFields=...&orderByFields=OBJECTID&f=geojson&resultOffset=N')Silently truncates at the server's maxRecordCount (often 2,000) with no warning. Check returnCountOnly=true first, page with resultOffset + orderByFields, and name columns in the UNION ALL (an empty last page has none).
OSM / Overpass (restaurants in a neighbourhood...)osm openstreetmap_search_places -> relation id -> openstreetmap_query_bbox{within:"R..."}Area-by-name leaks: a neighbourhood name can pull rows from a same-named place in another state. Always search inside the relation id. Overpass mirrors 500 often; retry.
Census ACS by address/tractcensus census_resolve_geography{name:"<address>"} -> census_query_data{dataset:"acs/acs5", ...}Returns MOE (...M vars) — report it. Needs a free CENSUS_API_KEY.
Render a map PNG to see what you builtmaplibre render_styleHeadless Chrome, OpenFreeMap basemap, no key.

Dropped: gis-mcp (88 tools, DuckDB covers it), the official Census MCP (needs Docker+Postgres), crawler-style ArcGIS MCPs with no paging, PostGIS (DuckDB covers it).

Web research / extraction

JobUseTraps
"Who runs ops at X", people/company researchexa web_search_exaKeyless. Often finds a company's own team page where generic web search finds nothing.
Fast read of a known pageexa web_fetch_exa {urls:[...]}Sub-second from its index — cached and no JS; stale is possible.
Exact-phrase search, rendered scrapefirecrawl~1,000 credits/mo free (scrape 1, search 2, JSON 5). JSON extraction invents fields — trust only what appears in the returned markdown.
Rendered crawl, unlimited, Cloudflare-hidden emailsCrawl4AI CLI crwl <url> -o markdownDecodes data-cfemail that curl misses. Batch: AsyncWebCrawler(...).arun_many.
JS page with nothing installedcurl https://r.jina.ai/<url>~20 req/min keyless, 2-18s.
  • Some city portals sit behind Cloudflare that nothing gets through headless; their ArcGIS REST layer usually has the same data.
  • Email: use the address the business publishes on its own site, then check MX for that exact domain. Directories mangle domains (a dropped or added letter is common). Mailbox-level verification usually isn't possible from a home connection; port 25 is blocked.
  • Dropped: Reddit MCP (403 anonymous — use reddit-mining), browser-use (needs a paid LLM key), Browserbase (phone verify). Tavily/Apify/Hunter/Brave all stop at a CAPTCHA on signup — one human click each if wanted.

Finance / government data

JobUseTraps
Reported financials, latest quartersec-edgar get_xbrl_concepts (per-filing)EDGAR companyfacts (what many tools' get_key_metrics read) can be a quarter behind — it silently stops at the prior quarter. Per-filing XBRL gets the latest right. See sec-financials.
Prices, analyst up/downgrades, estimatesyfinanceTreat as flaky; verify a close against the exchange's own page before using a number.
SAM.gov opportunities, grants.gov, data.gova keyless gov data MCPThe free SAM route (SAM's own API needs login.gov MFA). Search results omit NAICS/set-aside — fetch each notice.
USAspending awardsusaspendingFilters by place of performance, not recipient location — for "recipients in state X" call spending_by_award with recipient_locations. "Award Amount" is lifetime, not fiscal year.
10-yr Treasury etc.keyless curl "https://fred.stlouisfed.org/graph/fredgraph.csv?id=DGS10&cosd=<YYYY-MM-DD>"FRED lags Treasury's own curve by ~1 day.

Frameworks

  • Claude Agent SDK for scheduled headless agents (e.g. a uv script that calls the sec-edgar MCP and writes JSON). Under macOS launchd it can't read ~/Desktop or ~/Documents — stage files elsewhere.
  • promptfoo evals for a chat product: run the real system prompt through claude -p with deterministic asserts (banned words, word caps). Set PROMPTFOO_DISABLE_TELEMETRY=1. Pass the prompt on stdin (--tools "" swallows a positional prompt).
  • Observable Framework for data -> static site (Python loaders via uv run). A literal analytics <script> tag breaks the build; inject it at runtime.
  • uv scripts (PEP 723 inline deps) for every small pipeline.
  • Dropped: Evidence.dev (now a login-gated studio), Pydantic AI/DSPy for small jobs (the SDK covers it), heavy vendor plugins that cost thousands of context tokens per session.

Ops

NeedUseNote
One-off product-analytics questions ("what events exist", funnels)posthog (single exec tool)Same numbers as HogQL. A personal API key can write flags/cohorts — keep it read only.
Read texts on a Macimessage MCPBeats raw chat.db SQL: decodes attributedBody, drops tapbacks, resolves contacts. No send tool. Pin it — single maintainer.
Current library docscontext7Name the vendor in the query or it resolves the wrong library.

Keep a skill, not the MCP, where the MCP is slower and heavier for the same answer: Vercel (its MCP is ~240 tools incl. buy_domain; see vercel-api), Stripe (its MCP redacts customer names; see stripe-dashboard), GitHub (gh), Notion (curl; the hosted MCP rejects integration tokens), Apple Notes (apple-notes; MCPs ship delete tools). Never add an email provider's MCP that carries a send tool if your rule is that a human presses send.

Auth state

  • OAuth servers (canva, figma, orshot): if claude mcp list says "Needs authentication", run /mcp once in an interactive session. Keep passwords and tokens in the Keychain, never in a repo.
  • Revoke any OAuth grant in that site's settings -> Connected apps.

Adding a new MCP

Test before registering: npx -y @modelcontextprotocol/inspector --cli <cmd> --method tools/list (wrap the server in a shell script — the inspector swallows -e and server flags). Then: pin the version ([email protected]; reference servers do renumber), read the tool list for send/delete/publish tools, check telemetry defaults, and add one row above with its trap. Drop it when it stops earning its place.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

2016judea/ascii-charts

Build charts as plain Unicode-block text — bar, range, bullet, gap-bracket, star-histogram, heatmap, line, Venn, pie, donut and scatter — with a dependency-free Python script, for anywhere only monospace text survives (newsletter code blocks, Markdown, terminals, plain-text email, chat). Use when a chart has to embed as literal text instead of an image or a third-party chart service, or when you want a hand-made terminal look with no branding footer.

2016judea/buffett-checklist

Apply Warren Buffett's investment framework as a discipline lens when weighing a buy, hold, or sell decision — circle of competence, economic moat, owner earnings & intrinsic value, margin of safety, management/capital-allocation quality, and market psychology (Mr. Market, fear vs greed, temperament). Use when asked to "run this through Buffett", "what would Buffett say", "does this pass the moat test", "is this cheap enough", or for a second, more skeptical read on a name being evaluated or already held. This is a discipline overlay, not a replacement for a strategy — it applies the Buffett lens to how someone actually invests, rather than issuing generic advice.

2016judea/image-riff

Turn one or more reference images into original art in that reference's own visual language, then cut it to whatever surface it's for. Use when you paste or point at art and say "use this as the base image", "generate art from this", "riff on this", "some creative ideation with these images", "make me a channel banner / avatar / cover / plate", "wilder version of this", or want a spread of options off one piece of reference. This is the TASK skill; the engine is the `make-art` tool skill.

2016judea/leonardo

Draw the way Leonardo da Vinci drew — a study sheet, a notebook folio, a red-chalk or silverpoint study, a machine cutaway, a storm of vortices — in his real materials and page-logic, generated with the make-art engine and anchored on fifteen of his actual (public-domain) sheets. Use when you say "Leonardo", "da Vinci", "like his notebooks", "a codex page of X", "draw this as one of his study sheets", "sanguine", "silverpoint", or wants a design, diagram, or illustration in that hand. Also a reading guide to his notebooks (Richter's 1883 public-domain translation) for "what did Leonardo say about shadow / trees / water". This is a TASK skill; the engine is `make-art`.

2016judea/records-request

Get a specific record out of a US government office by public-records request — "request the assessor's model", "file a data practices request", "FOIA this", "open records request", "can we just ask the county for it", "who do I write to at <county>", "chase that request", "did they ever answer". Covers checking the website first, finding the right office and statute, the carve-out paragraph that makes a request answerable instead of refused, web-form traps (hidden character caps, WAFs that reject apostrophes), chasing (there is usually no deadline), whether what comes back may be republished, and parsing multi-year tables without silent errors.

2016judea/sms-native-product

Build a product whose interface is text messages rather than an app or a website — "no app, no website", "they just text a number", "chat with our agent natively in Text Messages", "can we do this over text", "an SMS bot", "a Telegram bot", "make it a group chat", "minimum viable friction". Fires equally when it has already gone wrong — "my campaign got rejected", "our number is blocked", "the texts aren't arriving", "why do I need to register". Covers the gate that decides whether such a product can send at all (US A2P 10DLC registration, SHAFT content rules, permanent rejection codes), group MMS from code, what each channel can't do, an architecture that survives losing the channel, and guarding model-rewritten user content.

2016judea/vertical-market-agent

Build a chat agent that knows one industry in one metro better than any general model because it carries a precomputed digest of real public records (or a mined review corpus) and can pull live records mid-conversation — finding the moat, building a byte-stable substrate, enumerating what the records can't, the data traps that produce plausible wrong numbers, deterministic math in tools, measured prompt cost and cache TTL, shipping as an ad destination, an off-sector ending, and a precomputed spatial "what is this next to" layer. Use when building a vertical AI agent grounded in records rather than general knowledge.

Related Skills