@stackscan/mcp-server
Advanced tools
+5
-5
@@ -106,3 +106,3 @@ #!/usr/bin/env node | ||
| // A bot-protection interstitial is HTML, not JSON, and is by far the most | ||
| // likely cause of a non-JSON reply — the edge blocks non-browser TLS | ||
| // likely cause of a non-JSON reply: the edge blocks non-browser TLS | ||
| // fingerprints before the request ever reaches StackScan. Say so, because | ||
@@ -122,3 +122,3 @@ // "non-JSON 403" sends people hunting for a bug in their token. | ||
| if (response.ok) { | ||
| // A miss arrives as 200 {success: false, error: "..."} — not a 404. | ||
| // A miss arrives as 200 {success: false, error: "..."}, not a 404. | ||
| if (body.success === false) { | ||
@@ -207,3 +207,3 @@ return { | ||
| inputSchema: { | ||
| domain: z.string().describe("Bare domain, e.g. shopify.com (no scheme, no path)"), | ||
| domain: z.string().describe("Bare domain, e.g. example.com (no scheme, no path)"), | ||
| }, | ||
@@ -240,3 +240,3 @@ }, async ({ domain }) => { | ||
| inputSchema: { | ||
| domain: z.string().describe("Bare domain, e.g. shopify.com (no scheme, no path)"), | ||
| domain: z.string().describe("Bare domain, e.g. example.com (no scheme, no path)"), | ||
| limit: z.number().int().min(1).max(50).optional().describe("Max technologies to return (default 25, cap 50)"), | ||
@@ -316,3 +316,3 @@ }, | ||
| .max(BATCH_MAX) | ||
| .describe(`Bare domains, e.g. ["shopify.com","stripe.com"]. Maximum ${BATCH_MAX}.`), | ||
| .describe(`Bare domains, e.g. ["example.com","stripe.com"]. Maximum ${BATCH_MAX}.`), | ||
| }, | ||
@@ -319,0 +319,0 @@ }, async ({ domains }) => { |
+2
-2
| { | ||
| "name": "@stackscan/mcp-server", | ||
| "version": "0.1.0", | ||
| "version": "0.1.1", | ||
| "description": "MCP server for the StackScan Tech Lookup API - look up the technology stack and the company behind any domain.", | ||
@@ -52,2 +52,2 @@ "keywords": [ | ||
| } | ||
| } | ||
| } |
+11
-11
@@ -9,5 +9,5 @@ # StackScan MCP server | ||
| > What is shopify.com built on? | ||
| > What is example.com built on? | ||
| > | ||
| > Who's behind vercel.com — where are they, what industry, what's their LinkedIn? | ||
| > Who's behind vercel.com? Where are they, what industry, what's their LinkedIn? | ||
| > | ||
@@ -57,3 +57,3 @@ > How many sites run Klaviyo, and in which countries? | ||
| Same shape — `command: npx`, `args: ["-y", "@stackscan/mcp-server"]`, and the two | ||
| Same shape: `command: npx`, `args: ["-y", "@stackscan/mcp-server"]`, and the two | ||
| environment variables. Check your client's own MCP docs for where its config file lives. | ||
@@ -79,3 +79,3 @@ | ||
| deliberately does not. A tool result goes straight into the model's context, and a | ||
| hundred full company payloads is tens of thousands of tokens — it crowds out the | ||
| hundred full company payloads is tens of thousands of tokens, which crowds out the | ||
| conversation you are actually having, and the model then has to re-read all of it | ||
@@ -85,3 +85,3 @@ to answer anything. Twenty compact rows is a table a model can reason over. | ||
| It also refuses rather than truncates. If a batch would cost more than your session | ||
| cap allows, it charges nothing and tells you how many you can afford — quietly | ||
| cap allows, it charges nothing and tells you how many you can afford. Quietly | ||
| dropping domains would hand back an answer that looks complete and is not. | ||
@@ -98,4 +98,4 @@ | ||
| |---|---|---|---| | ||
| | `STACKSCAN_API_TOKEN` | yes | — | Dashboard → API Tokens | | ||
| | `STACKSCAN_TENANT_ID` | yes | — | Your workspace UUID, same page | | ||
| | `STACKSCAN_API_TOKEN` | yes | none | Dashboard → API Tokens | | ||
| | `STACKSCAN_TENANT_ID` | yes | none | Your workspace UUID, same page | | ||
| | `STACKSCAN_API_BASE` | no | `https://api.stackscan.com` | Rarely needed | | ||
@@ -106,3 +106,3 @@ | `STACKSCAN_SESSION_LOOKUP_CAP` | no | `25` | See below | | ||
| StackScan's own limit is a **rate** limit — requests per minute. That stops a burst. It | ||
| StackScan's own limit is a **rate** limit: requests per minute. That stops a burst. It | ||
| does nothing to stop a patient agent quietly spending an entire credit balance over an | ||
@@ -117,3 +117,3 @@ afternoon, which is a failure mode humans clicking buttons do not have. | ||
| Raise it deliberately if you mean to — `"STACKSCAN_SESSION_LOOKUP_CAP": "200"` — rather | ||
| If you mean to go higher, raise it deliberately (`"STACKSCAN_SESSION_LOOKUP_CAP": "200"`) rather | ||
| than finding out afterwards. | ||
@@ -154,3 +154,3 @@ | ||
| **Cached responses are still charged.** The API's response cache shields its database, | ||
| not your wallet — a repeat lookup inside the cache window costs the same credit. That is | ||
| not your wallet: a repeat lookup inside the cache window costs the same credit. That is | ||
| why the local balance decrements on every hit instead of trying to guess which calls | ||
@@ -175,3 +175,3 @@ were free. | ||
| The licence covers this client only — roughly 500 lines that make HTTP requests. | ||
| The licence covers this client only, roughly 500 lines that make HTTP requests. | ||
| The StackScan data it reaches is a paid service and is not covered by it. |
27149
-0.07%