diff --git a/AGENT-SURFACE-SPEC.md b/AGENT-SURFACE-SPEC.md index fef5e06..ca4d67a 100644 --- a/AGENT-SURFACE-SPEC.md +++ b/AGENT-SURFACE-SPEC.md @@ -1,16 +1,78 @@ # Agent-Facing Surface Spec — MCP Distribution, x402, and Blueprint -This is the standard for how every StackApps member app presents itself to -automated consumers: MCP tooling, x402 paid endpoints, and blueprint.txt. -Follow it for any new app, and bring an existing app into line with it the -next time you touch that app's agent-facing surface. +**Hand this file to any app and say “go.”** You do not need a second brief. +The operator prompt is: bring this app’s agent-facing surfaces to the +parity bar below, using live Imagcon as the worked example, and follow the +three pillars in this document for distribution, x402, and blueprint +discipline. + +## Go — definition of done (parity bar) + +An app’s agent-facing surface is done only when **all** of these are true: + +1. **Code ↔ docs ↔ live URL agree.** Registered MCP tools (and paid x402 + routes) match what `blueprint.txt` / capability files claim, match what + `llms.txt` (or equivalent agent digest) claims, and match what a stranger + gets when they `curl` the **live** URLs — not only what’s in the repo. +2. **No orphan tools, no ghost tools.** Every real tool has a capability + (or an explicit, honest exception). Every named tool still exists. +3. **Local vs hosted (if both exist) is explicit.** What each transport + omits, and whether `output_dir` extracts locally or the hosted path + returns a download URL, is stated where an agent would act on it. +4. **Install/version claims are checkable and true** (Pillar 1). +5. **x402 prices/descriptions/status match the blueprint** (Pillar 2) — + edit the canonical x402 docs, do not fork them here. +6. **You verified the live artifacts yourself after deploy** (Pillar 3). + +Repo-correct and live-wrong is **not** done. FAQ / marketing blurbs that +still teach the old matrix are **not** done. + +### Canonical worked example (public) + +Use Imagcon’s live surfaces as the reference implementation of this bar: + +- https://imagcon.app/blueprint.txt + (also https://imagcon.app/.well-known/blueprint.txt) +- https://imagcon.app/llms.txt +- Capability files under https://imagcon.app/blueprints/ + +Imagcon is the flagship example: copy its *discipline* (inventory parity, +transport honesty, deploy-then-curl), not its product features. If this +app’s surfaces would confuse an agent that already understands Imagcon’s +blueprint shape, they are not done. + +### Operator prompt (paste as-is) + +> Apply `AGENT-SURFACE-SPEC.md` end to end to this app. Bring MCP, x402, +> and blueprint/`llms` (or equivalent) to the Go parity bar. Use live +> Imagcon (`imagcon.app/blueprint.txt` + `llms.txt`) as the worked +> example. Do not fork x402 rules — follow the pointers in Pillar 2. +> Done means live URLs verified, not only a green local diff. + +--- -Written 2026-07-23 after `stackapps-suite-mcp` spent 9+ days with fixed code -that never reached PyPI, then a registry entry that actively lied about -which PyPI version existed, then a live blueprint.txt that was 12 days -stale — three separate instances of the same failure inside one package. -Every rule below traces back to one of those three, or to the investigation -that fixed them. Where a rule seems arbitrary, read the "Why" — it isn't. +## Scope and reuse + +This is the standard for how StackApps member apps present themselves to +automated consumers: MCP tooling, x402 paid endpoints, and blueprint.txt. +It is written so the same file can be applied to any member app, and so +the standard itself can be published or reused outside StackApps without +a private oral tradition — the Go section, Imagcon URLs, and pillars are +the complete handoff. + +StackApps-specific paths below (`JOINING-THE-GATEWAY.md`, suite-mcp +workflows, `mcp.stackapps.app`) are **concrete instances** of the rules. +When applying this outside StackApps, keep the rules and swap in that +org’s canonical x402/gateway docs and deploy scripts. + +Written 2026-07-23 after `stackapps-suite-mcp` spent 9+ days with fixed +code that never reached PyPI, then a registry entry that actively lied +about which PyPI version existed, then a live blueprint.txt that was 12 +days stale — three separate instances of the same failure inside one +package. A later Imagcon pass confirmed the same disease on a flagship +app (repo honest, live stale; tool inventory drift across blueprint / +`llms.txt` / FAQ). Every rule below traces back to those incidents. +Where a rule seems arbitrary, read the "Why" — it isn't. This document covers pillars 1 and 3 below in full. Pillar 2 (x402) is already fully specified elsewhere and is summarized here only enough to @@ -24,11 +86,12 @@ disease this spec exists to prevent. ## The one rule underneath all the others **A change is not done when the code is correct. It is done when the thing -a stranger (human or agent) actually reaches — the live PyPI page, the live -registry entry, the live blueprint.txt URL — reflects it, and you checked -that URL yourself.** Every section below is this rule applied to one -specific surface. If you're ever unsure whether something needs a step -beyond "commit and push," assume it does and go verify the live artifact. +a stranger (human or agent) actually reaches — the live package/install +URL, the live registry entry, the live blueprint.txt URL — reflects it, +and you checked that URL yourself.** Every section below is this rule +applied to one specific surface. If you're ever unsure whether something +needs a step beyond "commit and push," assume it does and go verify the +live artifact. --- @@ -133,7 +196,8 @@ Fully specified in: strategy). - `stackapps-mcp/JOINING-THE-GATEWAY.md` (the concrete checklist for wiring a new app's paid routes into the shared gateway — invariants, payTo pin, - per-call cap, signature rules). + per-call cap, signature rules). That file has its own **Go** section; + for a gateway join, hand **both** this spec and JOINING-THE-GATEWAY.md. The one thing worth restating here because it connects directly to Pillar 3: **every x402 route's price, description, and status must match what @@ -200,19 +264,17 @@ rule being violated in the wild; fix it the next time this file is touched. ## Applying this to a new member app -1. **x402 routes:** follow `JOINING-THE-GATEWAY.md` Part A end to end. -2. **Gateway wiring:** follow `JOINING-THE-GATEWAY.md` Part B, but for the - release step (Part B, item 5), use this document's Pillar 1 release - checklist instead of the `client/public/downloads` wheel-copy process - described there — that process was superseded by the GitHub Release - pattern and is stale (flagged for cleanup; `client/public/downloads/` - in this repo still holds orphaned 0.1.5/0.1.7 wheels from when that was - the real path). -3. **Blueprint:** update the app's own `blueprint.txt` (or the shared - gateway's, if the capability is x402/MCP) per Pillar 3, deploy it, and - verify the live URL before considering the app's agent-facing surface - done. -4. **If the app ever wants its own standalone MCP server** (like +Stop when the **Go — definition of done** checklist at the top is satisfied +for this app (including live URL verification). The steps below are the +StackApps wiring path; the parity bar is the exit criterion. + +1. **x402 + gateway join:** hand and follow `JOINING-THE-GATEWAY.md` (it + already points here for release/live-URL rules). Its Go checklist must + pass in addition to this file’s Go bar. +2. **Blueprint:** update the app's own `blueprint.txt` (and the shared + gateway’s when tools are added there) per Pillar 3, deploy it, and + verify the live URL before considering the agent-facing surface done. +3. **If the app ever wants its own standalone MCP server** (like `imagcon-mcp`, distinct from the shared gateway) rather than plugging into `stackapps-suite-mcp`: apply Pillar 1 to that package independently. It gets its own repo, its own releases, its own diff --git a/stackapps-mcp/JOINING-THE-GATEWAY.md b/stackapps-mcp/JOINING-THE-GATEWAY.md index 730df2a..1f83f23 100644 --- a/stackapps-mcp/JOINING-THE-GATEWAY.md +++ b/stackapps-mcp/JOINING-THE-GATEWAY.md @@ -1,15 +1,78 @@ # Joining the Gateway — Playbook for Adding a Member App -This is the authoritative checklist for adding a new StackApps member app's paid -tools to the stackapps-suite-mcp gateway. Follow it exactly — do not improvise -from other apps' code. When this document and existing code disagree, this -document wins; flag the discrepancy to Abe. +**Hand this file with `../AGENT-SURFACE-SPEC.md` and say “go.”** You do not +need a second brief. This document is the concrete wiring checklist for +plugging a member app’s paid HTTP routes into `stackapps-suite-mcp`. +`AGENT-SURFACE-SPEC.md` is the parity / distribution / live-URL bar that +applies to **both** the member app and this gateway. Neither file alone is +enough for a full join. + +## Go — definition of done + +Joining is done only when **all** of these are true: + +1. **Part A (app):** each new paid route returns a real `402` whose decoded + `payTo` equals the suite wallet; network/asset/amount match the contract + below; the app’s **own** live `blueprint.txt` (and agent digest if any) + lists the route at the correct price (see `AGENT-SURFACE-SPEC.md`). +2. **Part B (gateway):** adapter + `@mcp.tool`s + `stackapps_mcp/blueprint.txt` + + release + `./deploy-mcp.sh` are done; **live** + `https://mcp.stackapps.app/blueprint.txt` shows the new tools, prices, + and member status — `curl` verified, not assumed from deploy exit code. +3. **Inventory parity:** every new tool in `server.py` appears in the + gateway blueprint’s `### MCP TOOLS` and a `## CAPABILITY:` block. No + orphan tools; no ghost tools. (Same disease as Imagcon/suite drift — + see `AGENT-SURFACE-SPEC.md` Pillar 3.) +4. **Cap honesty:** if any tool costs more than the current + `STACKAPPS_MAX_USD_PER_CALL` default (**$0.50**), you raised the cap + deliberately in the same change and documented it in the blueprint + `client-safety` note. Do not ship a tool that the client will refuse + to sign. (`dicta_transcribe_long` at **$0.59** is the existing example — + it requires the cap override path; copy that discipline, don’t ignore it.) +5. **Verification checklist** at the bottom of this file is fully checked, + including one real paid call per new paid tool. + +Repo-correct and live-wrong is **not** done. + +### Operator prompt (paste as-is) + +> Apply `JOINING-THE-GATEWAY.md` and `AGENT-SURFACE-SPEC.md` to add this +> app’s x402 capabilities to `stackapps-suite-mcp`. Follow Parts A and B +> exactly; do not invent a second MCP server for the suite. Done means +> live `https://mcp.stackapps.app/blueprint.txt` and the app’s own live +> blueprint both verified by curl, with tool inventory matching `server.py`. + +### Worked examples + +- **App-side x402 contract:** Imagcon + (`https://imagcon.app/blueprint.txt`, routes under + `https://imagcon.app/routes/x402/…`). +- **Gateway adapter shape:** `stackapps_mcp/imagcon.py` (+ `stackbill.py`, + `dicta.py`). +- **Surface discipline:** live Imagcon + `AGENT-SURFACE-SPEC.md` Go bar. -**Architecture recap:** There is exactly ONE MCP server for the whole suite -(this package). Member apps never get their own MCP server. Each member app -hosts its own x402 paid HTTP routes on its own backend; the gateway's tools -relay to those routes and handle payment. Cloud Run (`mcp.stackapps.app`) -serves blueprint discovery ONLY — paid tools run locally over stdio. +--- + +## Architecture (read before wiring) + +There is exactly **one suite gateway MCP server**: this package +(`stackapps-suite-mcp`). Paid suite tools run locally over stdio with +`WALLET_PRIVATE_KEY`. Cloud Run (`mcp.stackapps.app`) serves blueprint +discovery ONLY — never set the wallet key there. + +**Do not create a second suite MCP** for the new app. Tools plug into this +package. + +**Separate from the suite:** a member app may also ship its **own** +account-key MCP (e.g. Imagcon’s `imagcon-mcp` via `ic_live_` keys). That is +a different product surface (credits / API key, not suite wallet relay). +If you add one, apply `AGENT-SURFACE-SPEC.md` Pillar 1 to that package +independently — do not confuse it with this gateway join. + +When this document and existing code disagree, this document wins; flag the +discrepancy to Abe. When this document and `AGENT-SURFACE-SPEC.md` disagree +on distribution or live-URL discipline, **AGENT-SURFACE-SPEC wins** (this +file already defers release/deploy verification to it). --- @@ -22,14 +85,17 @@ serves blueprint discovery ONLY — paid tools run locally over stdio. - Network `eip155:8453` (Base mainnet), asset USDC (`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`). - The payment guards in `SuiteX402Http` (pay-to pin + per-call amount cap). - Never bypass them "temporarily". If a new tool must cost more than $0.50, - raise `_DEFAULT_MAX_USD_PER_CALL` deliberately and update the `client-safety` - note in `blueprint.txt` in the same commit. + Never bypass them "temporarily". If a new tool must cost more than the + current default (**$0.50**, env `STACKAPPS_MAX_USD_PER_CALL`), raise the + cap deliberately and update the `client-safety` note in + `stackapps_mcp/blueprint.txt` in the same commit. Existing exception: + Dicta long-form transcribe at $0.59 — that join already required the + override path; any new over-cap price needs the same explicit treatment. - `WALLET_PRIVATE_KEY` is NEVER set on Cloud Run. The hosted service is discovery-only (`discovery_only=True`). See `http_main.py` and `deploy-mcp.sh`. - `stateless_http=True` on the FastMCP constructor and the SSE guard middleware stay in place (Cloud Run requirements — see global CLAUDE.md). -- Do NOT create a new MCP server for the new app. Tools plug in here. +- Do NOT create a new **suite** MCP server for the new app. Tools plug in here. --- @@ -49,13 +115,18 @@ contract (framework doesn't matter; Imagcon's backend is the worked example): - `payTo: 0x1f2A484ef654d49c58c625b09e78B538501D652D` (the suite wallet — use the shared `X402_PAY_TO_ADDRESS` env var, never a new wallet) - `amount`: price in USDC atomic units (6 decimals; $0.10 = `"100000"`). - Keep prices at or under $0.50 unless the gateway cap is raised first. + Keep prices at or under the gateway cap unless the cap is raised first + (see Invariants). 3. **On paid retry** (request carries the signed payment header), settle via the x402 middleware and return the result. 4. **Optional but recommended:** include the Bazaar `extensions` metadata in the challenge (input/output schema) — this is what gets the capability indexed. Copy the shape from Imagcon's middleware config. -5. **Verify before proceeding to Part B:** +5. **App blueprint (required for Go):** add/update the capability on the app’s + own live `blueprint.txt` (price, path, payment mechanics) and deploy/verify + per `AGENT-SURFACE-SPEC.md` Pillar 3. Gateway wiring does not replace the + app’s public agent surface. +6. **Verify before proceeding to Part B:** `curl -s -D - -o /dev/null -X POST https:///routes/x402/ -H 'Content-Type: application/json' -d '{}'` must return `HTTP 402` with a `Payment-Required` header whose decoded `payTo` equals the suite wallet exactly. @@ -93,7 +164,8 @@ these rules apply: 1. **Adapter module:** create `stackapps_mcp/.py` modeled on `stackapps_mcp/imagcon.py`: - URL constants for each endpoint. - - Constructor takes `(private_key, network)` and builds a `SuiteX402Http`. + - Constructor takes a `SuiteX402Http` (or `(private_key, network)` and + builds one — match the current pattern in `main.py`). - One method per capability calling `self._x402.post(...)`. - Do NOT copy Imagcon's profile-token logic unless the app actually issues `X--Token` headers. @@ -108,58 +180,71 @@ these rules apply: all sharing the wallet key. Close all clients in the `finally` block. 4. **Blueprint (`stackapps_mcp/blueprint.txt`):** update ALL of: - `# Version:` (bump minor) and `# Updated:` date - - `## SUMMARY` capabilities list (one line, with price) - - `### MCP TOOLS` (one line: `tool | params | description ($price) | source: `) - - a full `## CAPABILITY:` block with `### MCP tool:` sub-block - - `## SUITE` members list (move the app from "planned" to "live") + - `## SUMMARY` / IDENTITY copy if it lists member apps + - `### MCP TOOLS` (one line per tool: `tool | params | description ($price) | source: `) + - a full `## CAPABILITY:` block with `### MCP tool:` sub-block for each + - `## SUITE` members list (status accurate: live / demoted / planned — + do not leave a live app described as planned) + - **Parity check:** `server.py` tool names ⊆ blueprint MCP TOOLS. If you + only document “the new ones” and leave prior undocumented tools missing, + you failed Go (current known debt: Dicta tools and newer Imagcon tools + such as `check_icon` / `resize_generated_image` were live in code while + the gateway blueprint lagged — fix forward, don’t repeat). 5. **Release:** bump `version` in `pyproject.toml`, then follow the release checklist in `../AGENT-SURFACE-SPEC.md` (Pillar 1) — build the wheel, attach it to a GitHub Release, update every install line to the new release URL, and let the OIDC workflow re-publish the registry entry. Do **not** use `client/public/downloads/` or a `_WHEEL_URL` constant — that was the pre-2026-07-23 process and is superseded; PyPI is not the - distribution path either, for the same reason (see the spec's Pillar 1 - "why"). `client/public/downloads/` still holds orphaned 0.1.5/0.1.7 - wheels from the old process — leave them for now, don't resurrect the - pattern. + distribution path either (see AGENT-SURFACE-SPEC Pillar 1). + `client/public/downloads/` may still hold orphaned wheels from the old + process — leave them; don’t resurrect the pattern. 6. **Deploy discovery:** run `./deploy-mcp.sh` from the repo root (deploys the blueprint-only Cloud Run service; scale-to-zero, no secrets), then `curl https://mcp.stackapps.app/blueprint.txt` and confirm the live version - string actually changed — do not assume the deploy succeeded from its - exit code alone. + string and your new tool lines are actually there — do not assume the + deploy succeeded from its exit code alone. --- ## Verification checklist (all must pass) - [ ] Live 402 probe of each new app endpoint shows `payTo` == suite wallet. +- [ ] App’s own live blueprint lists each new route at the correct price. - [ ] Guard test: feed the engine a forged challenge (wrong wallet / over-cap) and confirm `NoMatchingRequirementsError` refusal; a legit challenge signs. (Use a throwaway key — see the test pattern in the session that built this.) +- [ ] If price > default cap: `STACKAPPS_MAX_USD_PER_CALL` / blueprint + `client-safety` updated in the same change. - [ ] `python -c "from stackapps_mcp import server, main"` imports cleanly in the package venv. - [ ] MCP inspector (or `claude mcp add` locally): new tools appear in the tool list with correct descriptions and prices. -- [ ] One real paid call per new tool from a funded test wallet; deliverable +- [ ] One real paid call per new paid tool from a funded test wallet; deliverable arrives; payment visible on Base for the correct amount. -- [ ] `https://mcp.stackapps.app/blueprint.txt` serves the updated version. -- [ ] Wheel installs: `uvx --from stackapps-suite-mcp --help`. +- [ ] `https://mcp.stackapps.app/blueprint.txt` serves the updated version **and** + lists every new `server.py` tool (parity). +- [ ] Wheel installs: `uvx --from stackapps-suite-mcp --help`. --- ## Current member apps -| App | Status | Adapter | +Status of adapters in this package (source of truth for “is there an adapter” +is the file; source of truth for “is the live blueprint honest” is +`curl https://mcp.stackapps.app/blueprint.txt` — those can drift; Go forbids +leaving that drift after your change). + +| App | Gateway adapter | Notes | |---|---|---| -| imagcon.app | live (7 paid + 4 free capabilities) | `stackapps_mcp/imagcon.py` | -| stackbill.app | live (1 paid + 1 free capability) | `stackapps_mcp/stackbill.py` | -| dicta-notes.com | live (2 paid + 3 free capabilities) | `stackapps_mcp/dicta.py` | -| stackslip.app | demoted (packing-slip x402 route showed ~$0 measured demand in the 2026-07-18 demand scan) | — | +| imagcon.app | `stackapps_mcp/imagcon.py` | Live. Paid x402 routes include icons/splash/generate/resize/validate/check-icon; free `resize-generated` + profile tools. Also has standalone `imagcon-mcp` (account-key) — not this gateway. | +| stackbill.app | `stackapps_mcp/stackbill.py` | Live. Invoice PDF + profile activate. | +| dicta-notes.com | `stackapps_mcp/dicta.py` | Live in code (transcribe + transcribe-long + profile/transcript tools). **Gateway blueprint must list them** — treat missing blueprint lines as a Go failure, not “optional polish.” | +| stackslip.app | — | Demoted (packing-slip x402 showed ~$0 measured demand in the 2026-07-18 scan). Do not list as planned. | Candidate future members (shipped apps, no x402 routes yet): stackspent.app, stacktax.app, stackvideo.app, stackagent.app, stacklaunch.app, calypterv.com, easyhomeflow.com. -Note (2026-07-23): this table and the blueprint's own capability list can -drift from the real tool set in `server.py` — see `../AGENT-SURFACE-SPEC.md` -Pillar 3 for why that matters and the standing rule to keep them in sync. +Do not hard-code capability counts in this table — they drift. Count tools in +`server.py` / the adapter when you need a number. diff --git a/stackapps-mcp/README.md b/stackapps-mcp/README.md index 839cbb0..eca692b 100644 --- a/stackapps-mcp/README.md +++ b/stackapps-mcp/README.md @@ -4,15 +4,16 @@ mcp-name: io.github.Explorer-64/stackapps-suite-mcp One MCP server for the whole [StackApps](https://stackapps.app) tool suite. Pay per call in USDC on Base mainnet via [x402](https://www.x402.org/) — no -account, no API key, no signup. Each member app (Imagcon today; more as they -ship) contributes tools; one install covers the suite. +account, no API key, no signup. Member apps (Imagcon, StackBill, Dicta-Notes) +contribute tools; one install covers the suite. ## Install -The package is self-hosted (not on PyPI). Install directly from the release wheel: +The package is self-hosted (not on PyPI). Install directly from the release wheel +documented in the live blueprint: ```bash -claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... +claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... ``` Or in any MCP client config (Claude Desktop, Cursor, Windsurf, Cline): @@ -24,7 +25,7 @@ Or in any MCP client config (Claude Desktop, Cursor, Windsurf, Cline): "command": "uvx", "args": [ "--from", - "https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl", + "https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl", "stackapps-suite-mcp" ], "env": { "WALLET_PRIVATE_KEY": "0x..." } @@ -37,6 +38,9 @@ Requirements: [uv](https://docs.astral.sh/uv/), Python 3.11+, an EVM wallet holding USDC on Base mainnet (eip155:8453). Prefer the `WALLET_PRIVATE_KEY` env var over the `--wallet-key` argument. +Always verify the current install URL and version at +[mcp.stackapps.app/blueprint.txt](https://mcp.stackapps.app/blueprint.txt). + ## Tools | Tool | Price (USDC) | What it does | @@ -44,15 +48,28 @@ env var over the `--wallet-key` argument. | `create_pwa_icons_from_image` | $0.10 | Full PWA icon set (27 files + manifest.json) from a local image | | `create_splash_screens_from_image` | $0.10 | 16 iOS/iPad splash screens from a local image | | `generate_pwa_icons` | $0.295 | AI-generated PWA icon set from a text description | -| `generate_image` | $0.195 | AI-generated source image (returns preview URL) | +| `generate_image` | $0.195 | AI-generated source image (returns image_key + preview URL) | | `generate_splash_screens` | $0.295 | AI-generated splash screens from a text description | -| `get_wallet_profile` | free | Check your wallet's Imagcon profile status | -| `setup_wallet_profile` | free | Activate a permanent account (wallet-signature verified) | +| `resize_image` | $0.02 | Resize a local image to exact dimensions or social presets | +| `validate_x402_endpoint` | $0.01 | Pre-flight check any x402 endpoint with a real signed probe | +| `resize_generated_image` | free | Resize a prior generate_image result by image_key (no second payment) | +| `check_icon` | $0.01 | Check icon compliance (maskable, android-adaptive, ios) | +| `create_invoice` | $0.10 | Professional invoice PDF from JSON line items | +| `get_wallet_profile_imagcon` | free | Look up Imagcon wallet profile status | +| `setup_wallet_profile_imagcon` | free | Activate permanent Imagcon account (or rotate API key) | +| `setup_wallet_profile_stackbill` | free | Activate permanent StackBill account | +| `dicta_transcribe_audio` | $0.10 | Transcribe short audio (up to 15 min) with diarization | +| `dicta_transcribe_long_audio` | $0.59 | Transcribe long-form audio (up to 2 hours) | +| `get_wallet_profile_dicta` | free | Look up Dicta-Notes wallet profile status | +| `setup_wallet_profile_dicta` | free | Activate permanent Dicta-Notes account (or rotate API key) | +| `recover_wallet_profile_dicta` | free | Recover lost Dicta-Notes API key by wallet signature | +| `list_dicta_transcripts` | free | List stored transcripts (requires Dicta API key) | +| `get_dicta_transcript` | free | Fetch a stored transcript by id (requires Dicta API key) | ## Payment safety The server refuses to sign any payment challenge that does not pay the -StackApps suite wallet, or that exceeds the per-call cap ($0.50 USDC by +StackApps suite wallet, or that exceeds the per-call cap ($0.59 USDC by default; override with `STACKAPPS_MAX_USD_PER_CALL`). A compromised or spoofed endpoint cannot redirect or inflate payments. Payments settle on-chain via EIP-3009 — the gas is sponsored; your wallet needs only USDC. @@ -71,4 +88,6 @@ Machine-readable capability contract (Blueprint Protocol): - Suite: https://stackapps.app - Source: https://github.com/Explorer-64/StackApps (`stackapps-mcp/`) -- Imagcon (current member app): https://imagcon.app +- Imagcon: https://imagcon.app +- StackBill: https://stackbill.app +- Dicta-Notes: https://dicta-notes.com diff --git a/stackapps-mcp/pyproject.toml b/stackapps-mcp/pyproject.toml index 26d9586..1bcc3c9 100644 --- a/stackapps-mcp/pyproject.toml +++ b/stackapps-mcp/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "stackapps-suite-mcp" -version = "0.1.8" +version = "0.1.9" description = "MCP gateway for the StackApps tool suite — pay per call in USDC via x402, no account required" readme = "README.md" requires-python = ">=3.11" diff --git a/stackapps-mcp/server.json b/stackapps-mcp/server.json index a958d37..bc5cb45 100644 --- a/stackapps-mcp/server.json +++ b/stackapps-mcp/server.json @@ -1,11 +1,12 @@ { "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.Explorer-64/stackapps-suite-mcp", - "description": "StackApps suite gateway: PWA icons, splash screens, AI images. Pay per call in USDC via x402.", + "description": "StackApps suite gateway: Imagcon, StackBill, Dicta-Notes. Pay per call in USDC via x402.", "repository": { "url": "https://github.com/Explorer-64/StackApps", - "source": "github" + "source": "github", + "subfolder": "stackapps-mcp" }, - "websiteUrl": "https://stackapps.app", - "version": "0.1.8" + "websiteUrl": "https://mcp.stackapps.app/blueprint.txt", + "version": "0.1.9" } diff --git a/stackapps-mcp/stackapps_mcp/blueprint.txt b/stackapps-mcp/stackapps_mcp/blueprint.txt index 03f0ed0..c9de2ed 100644 --- a/stackapps-mcp/stackapps_mcp/blueprint.txt +++ b/stackapps-mcp/stackapps_mcp/blueprint.txt @@ -1,5 +1,5 @@ # BLUEPRINT: StackApps MCP Gateway [x402] -# Version: 1.5.1 +# Version: 1.6.0 # URL: https://mcp.stackapps.app # Updated: 2026-07-23 @@ -8,8 +8,8 @@ name: StackApps MCP Gateway description: Unified x402 gateway for the StackApps tool suite. Pay per call in USDC on Base mainnet — no account required to start; first x402 payment may issue a temp API key (first payment only). Member apps live today: Imagcon (icons, splash, AI - images, resize, x402 validation) and StackBill (invoice PDFs). More as they ship. - One server, one install, the full suite. + images, resize, icon compliance, x402 validation), StackBill (invoice PDFs), and + Dicta-Notes (audio transcription). One server, one install, the full suite. category: developer-tools contact: support@stackapps.app @@ -25,10 +25,19 @@ capabilities: - generate-splash-screens: Text prompt → AI-generated 16 iOS/iPad splash screens — $0.295 USDC - resize-image: Resize image to exact dimensions or social presets (OG, Twitter, Instagram...) — $0.02 USDC - validate-x402-endpoint: Pre-flight check any x402 endpoint with a real signed probe — $0.01 USDC + - resize-generated-image: Resize a prior generate_image result by image_key — free + - check-icon: Check icon compliance (maskable, android-adaptive, ios) — $0.01 USDC - create-invoice: JSON in → professional invoice PDF out, server-side totals — $0.10 USDC + - dicta-transcribe-audio: Short audio URL → diarized transcript JSON (up to 15 min) — $0.10 USDC + - dicta-transcribe-long-audio: Long-form audio URL → diarized transcript JSON (up to 2 hours) — $0.59 USDC - get-wallet-profile-imagcon: Look up temp vs permanent Imagcon wallet profile — free - setup-wallet-profile-imagcon: Activate permanent Imagcon account from first-payment profile token — free - setup-wallet-profile-stackbill: Activate permanent StackBill account from first-payment profile token — free + - get-wallet-profile-dicta: Look up temp vs permanent Dicta-Notes wallet profile — free + - setup-wallet-profile-dicta: Activate permanent Dicta-Notes account from first-payment profile token — free + - recover-wallet-profile-dicta: Recover lost Dicta-Notes API key by wallet signature — free + - list-dicta-transcripts: List stored transcripts for this wallet (requires Dicta API key) — free + - get-dicta-transcript: Fetch a stored transcript by id (requires Dicta API key) — free ## AUTH provider: none @@ -38,12 +47,12 @@ note: No Firebase account or API key required to start. Each tool call settles i configured wallet and retries automatically — no user interaction needed per call. ## WALLET PROFILE -note: Imagcon and StackBill each run their own independent wallet-profile system — - separate signature domains, separate token namespaces, separate activate endpoints. - A wallet activated on one is NOT activated on the other; call both setup tools if - you use both apps. On every first payment from a new wallet to either app, that - app auto-creates a 60-day temporary account linked to the wallet address. No - action required to receive the temp account — activation is opt-in. +note: Imagcon, StackBill, and Dicta-Notes each run their own independent wallet-profile + system — separate signature domains, separate token namespaces, separate activate endpoints. + A wallet activated on one is NOT activated on the others; call each app's setup tool if + you use that app. On every first payment from a new wallet to any app, that app + auto-creates a 60-day temporary account linked to the wallet address. No action required + to receive the temp account — activation is opt-in. ### Imagcon headers-on-first-payment: @@ -95,18 +104,47 @@ paper-plan: If setup_wallet_profile_stackbill is never called, the temp account auto-deletes after 60 days. Next invoice payment from same wallet starts a fresh 60-day window and invoice numbering resets. +### Dicta-Notes +headers-on-first-payment: + - X-Dicta-Token: profile token (tok_...) — stored in session only, never echoed in tool text + - X-Dicta-Profile-Setup: activate URL (non-secret) — first payment only + - X-Dicta-Api-Key: Dicta-Notes API key (dn_live_...) — first payment only; unlocks list_dicta_transcripts / get_dicta_transcript +surfaced-by: stackapps-suite-mcp appends a non-secret opt-in message to transcribe tool + results on first payment only (when X-Dicta-Profile-Setup is present). Secrets stay in + session memory — never in chat logs. Example: "A 60-day temp Dicta-Notes account was + created for your wallet. To keep it permanently (free), call setup_wallet_profile_dicta + with the profile token from secure storage, or visit the activate URL. A Dicta-Notes API + key was issued — needed for list_dicta_transcripts / get_dicta_transcript (store securely, + not in chat)." +activate-endpoint: POST https://dicta-notes.com/routes/x402/profile/activate + body: { "profile_token": "tok_...", "wallet_address": "0x...", "name": "...", + "terms_confirmed": true, "signature": "0x...", + "message": "dicta-notes.com/profile/activate:tok_...:" } + signature: EIP-191 personal_sign over the message — different domain from Imagcon's/ + StackBill's; signatures are not interchangeable. stackapps-suite-mcp signs automatically; + no agent input required. + terms: https://dicta-notes.com/terms-of-service + note: profile_token defaults to the session token from the first paid Dicta transcribe call + if omitted. rotate_api_key=True on setup_wallet_profile_dicta issues a fresh key without + the old one. recover_wallet_profile_dicta also re-issues the API key by wallet signature alone. +paper-plan: If setup_wallet_profile_dicta is never called, the temp account auto-deletes + after 60 days. Next transcribe payment from same wallet starts a fresh 60-day window. +stored-transcripts: Pass store=True on dicta_transcribe_audio or dicta_transcribe_long_audio + to keep the transcript for 60 days. list_dicta_transcripts / get_dicta_transcript require + the Dicta API key from a prior paid call, setup, or recover. + ## MCP server: stackapps-suite-mcp preferred-transport: stdio http-transport: discovery only — https://mcp.stackapps.app serves blueprint.txt; paid tools require local stdio with WALLET_PRIVATE_KEY. Do not use HTTP MCP on Cloud Run. -install: claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... +install: claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... package: self-hosted (not on PyPI) — GitHub Release asset, see install line above requirements: uv/uvx installed (https://docs.astral.sh/uv/). Python 3.11–3.12. EVM wallet private key. USDC on Base mainnet in that wallet. ### TRANSPORT (stdio) -command: uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... +command: uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... note: Runs as a local stdio process. Use WALLET_PRIVATE_KEY env var rather than passing the key on the command line. The version segment in the release URL must match a real tagged release — bump it on every version, it is not resolved for you. @@ -121,10 +159,19 @@ generate_image | description | AI-generate source image, returns image_key + pre generate_splash_screens | description, background_color, output_dir | AI-generate 16 iOS/iPad splash screens ($0.295 USDC) | source: imagcon.app resize_image | image_path, output_path, preset, width, height, mode, focal, background_color, output_format, quality | Resize local image to exact dimensions or social preset ($0.02 USDC) | source: imagcon.app validate_x402_endpoint | url, body | Real-payment probe of any x402 endpoint: facilitator verdict + lint + discovery ($0.01 USDC) | source: imagcon.app +resize_generated_image | image_key, output_path, preset, width, height, mode, focal, background_color, output_format, quality | Resize a prior generate_image result by image_key (free — no second payment) | source: imagcon.app +check_icon | image_path, target | Check icon compliance: maskable, android-adaptive, or ios ($0.01 USDC) | source: imagcon.app create_invoice | recipient_name, recipient_address, line_items, output_path, sender_name, sender_address, invoice_number, due_date, tax_rate, notes, template | Professional invoice PDF, server-side totals, per-wallet auto-numbering ($0.10 USDC) | source: stackbill.app get_wallet_profile_imagcon | (none) | Look up temp vs permanent Imagcon wallet profile (free) | source: imagcon.app -setup_wallet_profile_imagcon | name, terms_confirmed, profile_token, company_name, tax_id | Activate permanent Imagcon account from first-payment profile token (free) | source: imagcon.app +setup_wallet_profile_imagcon | name, terms_confirmed, profile_token, company_name, tax_id, rotate_api_key | Activate permanent Imagcon account or rotate API key (free) | source: imagcon.app setup_wallet_profile_stackbill | name, terms_confirmed, profile_token, company_name, tax_id, address | Activate permanent StackBill account from first-payment profile token (free) | source: stackbill.app +dicta_transcribe_audio | audio_url, store | Transcribe short audio (up to 15 min, 100 MB) — diarized JSON ($0.10 USDC) | source: dicta-notes.com +dicta_transcribe_long_audio | audio_url, store | Transcribe long-form audio (up to 2 hours, 400 MB) — diarized JSON ($0.59 USDC) | source: dicta-notes.com +get_wallet_profile_dicta | (none) | Look up temp vs permanent Dicta-Notes wallet profile (free) | source: dicta-notes.com +setup_wallet_profile_dicta | name, terms_confirmed, profile_token, rotate_api_key | Activate permanent Dicta-Notes account or rotate API key (free) | source: dicta-notes.com +recover_wallet_profile_dicta | profile_token | Recover lost Dicta-Notes API key by wallet signature (free) | source: dicta-notes.com +list_dicta_transcripts | limit | List stored transcripts for this wallet (free; requires Dicta API key) | source: dicta-notes.com +get_dicta_transcript | transcript_id | Fetch a stored transcript by id (free; requires Dicta API key) | source: dicta-notes.com ### PAYMENTS network: Base mainnet (eip155:8453) @@ -135,16 +182,20 @@ flow: Each tool call makes an HTTP request to the source app's x402 endpoint. Th wallet, and retries. Settlement is on-chain; funds go directly to the source app's wallet. StackApps takes no cut. prices: - - $0.01 USDC: validate_x402_endpoint + - $0.01 USDC: validate_x402_endpoint, check_icon - $0.02 USDC: resize_image - - $0.10 USDC: create_pwa_icons_from_image, create_splash_screens_from_image, create_invoice + - $0.10 USDC: create_pwa_icons_from_image, create_splash_screens_from_image, create_invoice, dicta_transcribe_audio - $0.195 USDC: generate_image - $0.295 USDC: generate_pwa_icons, generate_splash_screens - - free: get_wallet_profile_imagcon, setup_wallet_profile_imagcon, setup_wallet_profile_stackbill (no x402 charge) + - $0.59 USDC: dicta_transcribe_long_audio + - free: resize_generated_image, get_wallet_profile_imagcon, setup_wallet_profile_imagcon, + setup_wallet_profile_stackbill, get_wallet_profile_dicta, setup_wallet_profile_dicta, + recover_wallet_profile_dicta, list_dicta_transcripts, get_dicta_transcript (no x402 charge) client-safety: The server refuses to sign any payment challenge that does not pay - the StackApps suite wallet, or that exceeds the per-call cap ($0.50 USDC by - default; override with STACKAPPS_MAX_USD_PER_CALL). A compromised or spoofed - endpoint cannot redirect or inflate payments. + the StackApps suite wallet, or that exceeds the per-call cap ($0.59 USDC by + default; override with STACKAPPS_MAX_USD_PER_CALL). The default cap covers + dicta_transcribe_long_audio ($0.59). A compromised or spoofed endpoint cannot + redirect or inflate payments. ### REQUIRED-SECRETS - WALLET_PRIVATE_KEY: @@ -159,11 +210,19 @@ client-safety: The server refuses to sign any payment challenge that does not pa description: Optional override for X-Imagcon-Token header on subsequent x402 calls format: tok_... string from Imagcon first-payment response note: Normally stored in session memory automatically after first paid call +- DICTA_PROFILE_TOKEN: + description: Optional override for X-Dicta-Token header on subsequent x402 calls + format: tok_... string from Dicta-Notes first-payment response + note: Normally stored in session memory automatically after first paid Dicta call +- DICTA_API_KEY: + description: Dicta-Notes API key for list_dicta_transcripts / get_dicta_transcript + format: dn_live_... string from first payment, setup, or recover + note: Normally stored in session memory automatically after first paid Dicta call ### CLIENT-CONFIGS #### Claude Code (CLI) -claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... +claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl stackapps-suite-mcp --wallet-key 0x... #### Claude Code / Cursor / Windsurf / Cline (JSON) { @@ -172,7 +231,7 @@ claude mcp add stackapps-suite -- uvx --from https://github.com/Explorer-64/Stac "command": "uvx", "args": [ "--from", - "https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.8/stackapps_suite_mcp-0.1.8-py3-none-any.whl", + "https://github.com/Explorer-64/StackApps/releases/download/stackapps-suite-mcp-v0.1.9/stackapps_suite_mcp-0.1.9-py3-none-any.whl", "stackapps-suite-mcp", "--wallet-key", "0x..." ] @@ -564,6 +623,234 @@ source: stackbill.app/routes/x402/profile/activate ### MCP tool: setup_wallet_profile_stackbill +## CAPABILITY: resize-generated-image +description: Resize an image previously generated via generate_image (pass its image_key) + to exact dimensions or a social-media preset. Free — no second x402 payment, since the + source image was already paid for on generation. Presets and fit modes match resize_image. + Powered by Imagcon (imagcon.app). +input: + - name: image_key + type: string + required: true + description: image_key returned by generate_image. + - name: output_path + type: string + required: false + default: ./resized.png + description: Where the resized image is written. + - name: preset + type: string + required: false + description: Social preset (og, twitter-card, youtube-thumbnail, instagram-square, + instagram-portrait, instagram-story, linkedin-post, twitter-header, github-social). + - name: width + type: number + required: false + description: Target width in pixels (16-4096). + - name: height + type: number + required: false + description: Target height in pixels (16-4096). + - name: mode + type: string + required: false + default: cover + description: Fit mode — cover, contain, blur, or stretch. +output: + - type: file + description: Resized image written to output_path. +auth-required: false +payment: free (no x402 charge — source image already paid for) +source: imagcon.app/routes/x402/resize-generated + +### MCP +tool: resize_generated_image + +## CAPABILITY: check-icon +description: Check whether an existing icon meets real platform compliance rules — W3C + maskable safe zone, Android adaptive icon safe zone, or iOS App Store icon guidance. + Returns a structured pass/warn/fail/undetermined report. Distinct from + create_pwa_icons_from_image, which generates a full icon set rather than checking one + you already have. Powered by Imagcon (imagcon.app). +input: + - name: image_path + type: string + required: true + description: Absolute path to a PNG, JPEG, or WebP icon file on the local machine. + - name: target + type: string + required: true + description: Compliance target — maskable, android-adaptive, or ios. +output: + - type: json + description: Structured compliance report with pass/warn/fail/undetermined verdict. +auth-required: false +payment: $0.01 USDC per call (Base mainnet, x402) +source: imagcon.app/routes/x402/check-icon + +### MCP +tool: check_icon + +## CAPABILITY: dicta-transcribe-audio +description: Transcribe short audio (voicemail, call recording, memo, podcast clip — up + to 15 minutes, 100 MB) from a publicly reachable audio URL. Returns diarized, + timestamped transcript JSON; any spoken language is auto-detected and labeled per + segment. Set store=True to keep the transcript for 60 days. For recordings over 15 + minutes use dicta_transcribe_long_audio. Powered by Dicta-Notes (dicta-notes.com). +input: + - name: audio_url + type: string + required: true + description: HTTPS URL to an audio file (mp3, wav, m4a, etc.) the server can fetch. + - name: store + type: boolean + required: false + default: false + description: When true, keep the transcript for 60 days (retrievable via list/get tools). +output: + - type: json + description: Transcript JSON with segments, speakers, duration, and language labels. +auth-required: false +payment: $0.10 USDC per call (Base mainnet, x402) +source: dicta-notes.com/routes/x402/transcribe + +### MCP +tool: dicta_transcribe_audio + +## CAPABILITY: dicta-transcribe-long-audio +description: Transcribe long-form audio (meetings, interviews, hearings — up to 2 hours, + 400 MB) from a publicly reachable audio URL. Returns diarized, timestamped transcript + JSON; no other x402 transcription endpoint in the suite accepts recordings this long. + Set store=True to keep the transcript for 60 days. Synchronous — a 2-hour file can take + 15-30 minutes to process; the caller must hold the connection open. Powered by + Dicta-Notes (dicta-notes.com). +input: + - name: audio_url + type: string + required: true + description: HTTPS URL to an audio file the server can fetch. + - name: store + type: boolean + required: false + default: false + description: When true, keep the transcript for 60 days (retrievable via list/get tools). +output: + - type: json + description: Transcript JSON with segments, speakers, duration, and language labels. +auth-required: false +payment: $0.59 USDC per call (Base mainnet, x402) +source: dicta-notes.com/routes/x402/transcribe-long + +### MCP +tool: dicta_transcribe_long_audio + +## CAPABILITY: get-wallet-profile-dicta +description: Look up the Dicta-Notes wallet profile for the configured wallet address. + Use before prompting the user to activate — shows temp vs permanent status. + Dicta-Notes-only — separate from Imagcon and StackBill profiles. +input: [] +output: + - type: string + description: Profile status and optional timestamps (created_at, expires_at, activated_at). +auth-required: false +payment: free (no x402 charge) +source: dicta-notes.com/routes/x402/profile/{wallet} + +### MCP +tool: get_wallet_profile_dicta + +## CAPABILITY: setup-wallet-profile-dicta +description: Activate a permanent Dicta-Notes account linked to your wallet, or recover a + lost API key on an already-permanent profile (rotate_api_key=True). Call this after the + first x402 payment to dicta-notes.com. profile_token is stored in session memory after + the first paid call; pass explicitly from secure storage if needed. Permanent accounts + keep payment history indefinitely. Without activation the temp account auto-deletes after + 60 days (paper plan). Separate account system from Imagcon/StackBill. +input: + - name: name + type: string + required: true + description: Display name for the profile (person or business name). + - name: terms_confirmed + type: boolean + required: true + description: Must be true only after the human has read https://dicta-notes.com/terms-of-service and agreed. + - name: profile_token + type: string + required: false + description: tok_... token from first x402 payment to dicta-notes.com. Defaults to session token if omitted. + - name: rotate_api_key + type: boolean + required: false + default: false + description: When true on a permanent profile, issue a fresh API key by wallet signature alone. +output: + - type: string + description: Confirmation message with account status. +auth-required: false +payment: free (no x402 charge) +source: dicta-notes.com/routes/x402/profile/activate + +### MCP +tool: setup_wallet_profile_dicta + +## CAPABILITY: recover-wallet-profile-dicta +description: Recover a lost Dicta-Notes API key by wallet signature alone — no old key + needed. Works for both temp and permanent profiles. profile_token defaults to the + session token from the first paid Dicta transcribe call if omitted. +input: + - name: profile_token + type: string + required: false + description: tok_... token from first x402 payment to dicta-notes.com. Defaults to session token if omitted. +output: + - type: string + description: Confirmation that a new API key was issued (stored in session, not shown). +auth-required: false +payment: free (no x402 charge) +source: dicta-notes.com/routes/x402/profile/recover + +### MCP +tool: recover_wallet_profile_dicta + +## CAPABILITY: list-dicta-transcripts +description: List previously stored Dicta-Notes transcripts for this wallet (only transcripts + saved with store=True on a prior transcribe call). Requires a Dicta API key from a prior + paid call, setup_wallet_profile_dicta, or recover_wallet_profile_dicta. +input: + - name: limit + type: number + required: false + description: Max results to return (default 50, max 100). +output: + - type: json + description: Array of transcript summaries — id, route, created_at, expires_at, duration_seconds. +auth-required: true +payment: free (no x402 charge; requires Dicta API key) +source: dicta-notes.com/routes/x402/transcripts + +### MCP +tool: list_dicta_transcripts + +## CAPABILITY: get-dicta-transcript +description: Fetch a previously stored Dicta-Notes transcript by id (from list_dicta_transcripts). + Requires a Dicta API key. Returns the full transcript JSON — transcript, segments, + speakers, duration_seconds, language, languages_detected. +input: + - name: transcript_id + type: string + required: true + description: Transcript id from list_dicta_transcripts. +output: + - type: json + description: Full transcript JSON. +auth-required: true +payment: free (no x402 charge; requires Dicta API key) +source: dicta-notes.com/routes/x402/transcripts/{id} + +### MCP +tool: get_dicta_transcript + ## SUITE note: This gateway grows as member apps ship x402 endpoints. Each new capability will appear in ## MCP TOOLS above and as a ## CAPABILITY block below. @@ -571,6 +858,7 @@ note: This gateway grows as member apps ship x402 endpoints. Each new capability already installed receive new tools automatically on next connect. members: - imagcon.app — PWA icons, splash screens, AI image generation, image resize, - x402 endpoint validation (live) + icon compliance, x402 endpoint validation (live) - stackbill.app — invoice PDF generation with per-wallet accounts (live) - - stackslip.app — packing slips (planned) + - dicta-notes.com — audio transcription (short and long-form) with wallet profiles (live) + - stackslip.app — packing slips (demoted — ~$0 measured demand in 2026-07-18 scan) diff --git a/stackapps-mcp/stackapps_mcp/x402_http.py b/stackapps-mcp/stackapps_mcp/x402_http.py index cd338bc..a6226eb 100644 --- a/stackapps-mcp/stackapps_mcp/x402_http.py +++ b/stackapps-mcp/stackapps_mcp/x402_http.py @@ -15,7 +15,7 @@ # challenge from a suite endpoint. SUITE_PAY_TO = "0x1f2A484ef654d49c58c625b09e78B538501D652D" -_DEFAULT_MAX_USD_PER_CALL = 0.50 +_DEFAULT_MAX_USD_PER_CALL = 0.59 def _max_usdc_units() -> int: @@ -36,7 +36,7 @@ class SuiteX402Http: Handles the 402 challenge/sign/retry cycle with two guards applied before any payment is signed: the challenge must pay SUITE_PAY_TO, and the amount - must not exceed the per-call cap (STACKAPPS_MAX_USD_PER_CALL, default $0.50). + must not exceed the per-call cap (STACKAPPS_MAX_USD_PER_CALL, default $0.59). """ def __init__(self, private_key: str, network: str = "eip155:8453") -> None: