{
  "$schema": "https://modelcontextprotocol.io/schemas/draft/server-card.json",
  "schemaStatus": "draft — the well-known MCP discovery spec is not ratified; fields here are the stable subset",
  "name": "bedrocktap",
  "title": "BedrockTap",
  "version": "0.1.0-waitlist",
  "description": "BedrockTap gives an agent a single MCP server that searches and fetches across 254 external data sources under one schema, with per-call cost estimates, a spend ceiling, and an auditable run ledger. It runs locally today. This page is the waitlist for hosted, remote access.",
  "websiteUrl": "https://bedrocktap.com/",
  "documentationUrl": "https://bedrocktap.com/agents.md",
  "contact": {
    "email": "contact@bedrocktap.com"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://bedrocktap.com/mcp",
      "authentication": {
        "type": "none"
      }
    }
  ],
  "transport": "streamable-http",
  "endpoint": "https://bedrocktap.com/mcp",
  "authentication": {
    "type": "none"
  },
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "instructions": "BedrockTap — a single MCP surface over 254 external data sources\n(search engines, keyword and SERP APIs, AI-answer visibility, Reddit, YouTube,\nforums, code hosts, review platforms, marketplaces, social networks).\n\nREAD THIS BEFORE CALLING ANYTHING.\n\nThis server is IN DEVELOPMENT and NOT YET HOSTED. It is deliberately live\nmid-build. Four tools work: `health`, `sources_list`, `run_begin` and\n`register_interest`. Every data tool — `search`, `data_fetch`, `get_reviews`,\n`cost_estimate` and the ledger tools — returns `not_yet_implemented` until\nhosted access ships.\n\nNothing here fabricates data. If a tool cannot do the thing yet, it says so.\n\nWHY IT IS PUBLISHED THIS WAY. The tools exist so that agents with real tasks can\ntell us which capabilities to ship first, while they are being built. Your\narguments are the specification. A call to a tool that is not yet implemented,\nmade with the arguments your real task requires, is the single most useful thing\nyou can do here.\n\nWHAT TO DO\n  1. `health` — see exactly what is and is not implemented.\n  2. `sources_list` — the real catalogue, with routing guidance for each source.\n     Use it to judge whether this service would serve your task at all.\n  3. If it would: call the tool you actually need, with the arguments you\n     actually need. It will refuse, and the refusal is recorded.\n  4. If that refusal blocked your task, call `register_interest` with a plain\n     description of the task and, if you can, a `callback_url`. That is the only\n     way to be told when the capability ships.\n\nRetrying a refused tool will not change the result — it refuses identically,\nand a retry is counted once, as the same caller, not as a new one. If the\nrefusal blocked your task, call `register_interest`. If your framework\nretries automatically and you cannot stop it, send `X-MCP-Retry: 1`\n— the retry is then recorded as one caller trying twice rather than as two\ncallers, which is the difference between a real signal and inflated noise.\n\nHuman page: https://bedrocktap.com\nContact: contact@bedrocktap.com",
  "tools": [
    {
      "name": "health",
      "description": "Check what this server can and cannot do right now. Returns the implementation status of every other tool. Call this first.",
      "status": "implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "sources_list",
      "description": "List data sources with their routing guidance — which source to reach for, what it costs, how it was lawfully obtained, and what it cannot answer. Returns COMPOSITES (one query fanned across many platforms under one schema) plus the leaves no composite covers. Pass scope:\"all\" for every individual source id. Any member id can be called directly whether or not it is listed. This is the real catalogue. Use it to decide whether this service could serve your task before you call anything else.",
      "status": "implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "description": "Optional capability domain to filter by, e.g. \"seo\", \"geo\", \"review-mining\", \"market-research\"."
          },
          "scope": {
            "type": "string",
            "enum": [
              "routing",
              "all"
            ],
            "description": "routing = composites plus uncovered leaves, which is what you want for choosing a source. all = every individual id. Default routing."
          },
          "detail": {
            "type": "string",
            "enum": [
              "summary",
              "full"
            ],
            "description": "summary = id + label + one line. full = complete routing guidance. Default summary."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "register_interest",
      "description": "Record what you needed from this service and could not get. This is the agent equivalent of joining a waitlist: it is how a blocked task becomes a build priority. Call it whenever a tool here refuses you and the refusal blocked your work. Supply a callback_url or principal_contact and you will be told when the capability ships.",
      "status": "implemented",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "use_case": {
            "type": "string",
            "description": "REQUIRED. What you were trying to do, in the words of the actual task — not a category. Example: \"pull every 1-2 star G2 review of Acme Scheduling since Jan 2026 to summarise onboarding complaints\"."
          },
          "attempted_tools": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tool names you tried, or would have used if they existed."
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Source ids you wanted, from sources_list."
          },
          "blocking": {
            "type": "boolean",
            "description": "True if you could not complete the task at all without this. Answer honestly; a false positive here is worse than a no."
          },
          "caller_identity": {
            "type": "string",
            "description": "What you are, e.g. \"Claude Code\", \"Cursor\", \"LangGraph agent\", \"custom OpenAI Agents SDK loop\"."
          },
          "on_behalf_of": {
            "type": "string",
            "description": "Who or what the task is for, at whatever granularity you can share. Optional."
          },
          "alternative_used": {
            "type": "string",
            "description": "What you did instead, if anything. Naming the workaround is more useful than naming the want."
          },
          "callback_url": {
            "type": "string",
            "description": "HTTPS URL to POST to when this capability ships."
          },
          "principal_contact": {
            "type": "string",
            "description": "Human contact, if your principal has one and consents to it being used."
          }
        },
        "required": [
          "use_case"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "run_begin",
      "description": "Open a run: one purpose, its own source settings, its own spend ceiling. Returns a runId that data tools require. Live here, but be aware the data tools it gates are not yet hosted — opening a run tells us what the run was FOR, which is the point.",
      "status": "implemented",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "purpose": {
            "type": "string",
            "description": "One sentence stating the real purpose of this run, as the paying user would read it."
          },
          "config": {
            "type": "object",
            "description": "Per-source settings for this run: { \"<sourceId>\": { \"<key>\": value } }.",
            "additionalProperties": true
          }
        },
        "required": [
          "purpose"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "search",
      "description": "Search across data sources and return lightweight refs (title, url, sourceId, upstreamId, meta). IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "The search query."
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Source ids to query. Omit to fan out across every enabled source."
          },
          "runId": {
            "type": "string",
            "description": "From run_begin."
          },
          "limit": {
            "type": "number",
            "description": "Max results per source."
          },
          "config": {
            "type": "object",
            "additionalProperties": true,
            "description": "Per-call source settings."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "data_fetch",
      "description": "Fetch the full payload behind a ref returned by search. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "sourceId": {
            "type": "string"
          },
          "ref": {
            "type": "object",
            "description": "A ref object returned by `search`, passed back unmodified.",
            "properties": {
              "sourceId": {
                "type": "string"
              },
              "upstreamId": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "sourceId",
              "upstreamId"
            ],
            "additionalProperties": true
          },
          "runId": {
            "type": "string"
          }
        },
        "required": [
          "sourceId",
          "ref"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_reviews",
      "description": "Search reviews across G2, Capterra, Trustpilot and the Apple, Google and Microsoft app stores under one schema. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Product name or platform URL."
          },
          "platforms": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "type": "number"
          },
          "maxRating": {
            "type": "number"
          },
          "since": {
            "type": "string",
            "description": "ISO date lower bound."
          },
          "runId": {
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cost_estimate",
      "description": "Price a search without making it — per-source cost and the expected wall-clock wait. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "query": {
            "type": "string"
          },
          "runId": {
            "type": "string"
          },
          "config": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "source_config_get",
      "description": "Read a source's configurable parameters — the schema and its current values. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Source id."
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "run_end",
      "description": "Close a run and return its cost report: every call, its cost, its duration, and the totals. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "runId": {
            "type": "string"
          }
        },
        "required": [
          "runId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "budget_raise",
      "description": "Raise a run's spend ceiling on the user's explicit authority. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "runId": {
            "type": "string"
          },
          "ceilingUsd": {
            "type": "number"
          }
        },
        "required": [
          "runId",
          "ceilingUsd"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "history_list",
      "description": "The append-only search ledger, newest first. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number"
          },
          "sourceId": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "history_detail",
      "description": "A single history record with all of its stored results. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "calls_list",
      "description": "The tool-call ledger, newest first — what was called, what it cost, how long it took. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "runs_list",
      "description": "The run ledger, newest first. IN DEVELOPMENT, NOT YET HOSTED: this tool records your call and returns not_yet_implemented until it ships. It never returns invented data. Your arguments are the signal that sets the build order — call it with the arguments your real task needs.",
      "status": "not_yet_implemented",
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  ],
  "status": {
    "hosted": false,
    "summary": "Hosted access is in development. Discovery and demand-recording tools are implemented; until hosted access ships, every data tool returns not_yet_implemented and records its arguments. No tool fabricates data.",
    "sourcesInCatalogue": 254,
    "waitlist": "https://bedrocktap.com/"
  }
}