moonlight-lupin/agent-skills/endpoint-probe
Claude Code and agent skill by moonlight-lupin/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Use when you need to discover an API's surface — poke a base URL to find its type (REST, GraphQL, SOAP, JSON-RPC), auth scheme, available endpoints, rate limits, and CORS policy. Also probes MCP servers (HTTP and stdio) to discover tools, resources, and prompts with full input schemas. Runs a Python probe script that checks well-known discovery paths (OpenAPI/Swagger, GraphQL introspection, health, .well-known), fingerprints the server, sends OPTIONS for CORS, detects auth from 401/403 responses, and guesses common REST resources. For MCP, performs JSON-RPC initialize handshake then tools/list, resources/list, prompts/list. Feed it a base URL or MCP server URL, optionally with auth credentials.
Install
npx vskill@latest install moonlight-lupin/agent-skills/endpoint-probeSKILL.md
Endpoint Probe
Probe a base URL to discover its API surface: type, auth, endpoints, rate limits, CORS, and server fingerprint.
When to Use
- User gives you a base URL and asks "what API is available?" or "what endpoints does this have?"
- You need to understand an undocumented or partially-documented API before building an integration
- User asks "how does this API authenticate?" or "what auth does this endpoint need?"
- You're evaluating a third-party service and need to map its API surface
- User says "discover", "probe", "explore", or "recon" an API endpoint
- User wants to know what tools an MCP server provides before configuring it
- User asks "what does this MCP server offer?" or "what tools does MCP server X have?"
Don't use for:
- Scraping HTML page content (use
website-scraping) - QA testing of known functionality (use a QA/testing skill)
- Configuring MCP servers (use an MCP configuration skill) — this skill discovers MCP server surfaces, it doesn't configure them
- Monitoring an API over time (this is a one-shot discovery tool)
Workflow
1. Run the probe script
Options:
| Flag | Description | Default | |
|---|---|---|---|
--auth TOKEN | Auth token/credential | none | |
--auth-type | bearer, basic, or apikey | bearer | |
--header "Key: Value" | Custom header (repeatable) | none | |
--timeout N | Request timeout in seconds | 10 | |
--json | Output raw JSON instead of formatted report | off | |
--no-guess | Skip REST resource guessing | off | |
--api-version v1 | API version prefix for resource probing | none | |
--mcp | Probe as MCP server over HTTP (StreamableHTTP) | off | |
--mcp-stdio | Probe as MCP server over stdio (launch subprocess) | off | |
--mcp-env "KEY=value" | Env var for stdio MCP server (repeatable) | none | |
--allow-private | Allow probing private/internal IP addresses | off |
Examples:
2. Interpret the report
The probe runs 7 phases in sequence:
- Server fingerprint — identifies framework (Express, FastAPI, Django, Rails, Spring, etc.) from
ServerandX-Powered-Byheaders - Well-known paths — checks ~40 discovery paths:
/openapi.json,/swagger.json,/docs,/graphql,/.well-known/,/health,/version, etc. - GraphQL introspection — POSTs an introspection query to
/graphql,/api/graphql,/queryand extracts types if successful - OPTIONS / CORS — sends OPTIONS to
/,/api,/api/v1to discover allowed methods and CORS policy - Auth detection — hits likely-protected endpoints without credentials, examines 401/403 responses and
WWW-Authenticateheaders - Rate limits — checks for
X-RateLimit-*,RateLimit-*,Retry-Afterheaders - REST resource guessing — probes ~50 common resource paths (
/api/users,/api/orders, etc.) and reports non-404 responses
3. Use the findings
- OpenAPI found → parse the spec for full endpoint list, request/response schemas, auth schemes. The probe already extracts endpoints from the spec.
- GraphQL introspection works → you have the full type system. Build queries from the discovered types.
- Only REST resources found → the API is undocumented. Use the discovered resource paths as a starting point and probe individual endpoints with GET/POST/PUT/DELETE.
- Auth detected → use the identified scheme for all subsequent requests.
- Nothing found → the API may be behind a login, use non-standard paths, or not exist at that URL. Try with auth credentials, or check if the base URL is correct.
MCP Server Probing
The probe also supports discovering MCP (Model Context Protocol) server surfaces — tools, resources, and prompts with full input schemas. This lets you evaluate an MCP server before configuring it in Hermes.
MCP over HTTP (StreamableHTTP transport)
MCP over stdio (local subprocess)
What the MCP probe discovers
The probe performs the full MCP handshake sequence:
- Initialize — JSON-RPC
initializewith protocol version, client info, and capabilities. Reports server name, version, protocol version, and server capabilities. - Tools —
tools/list→ all tool names, descriptions, and full input schemas (parameter names, types, required/optional, defaults, enums) - Resources —
resources/list→ all resource URIs, names, descriptions, and MIME types - Prompts —
prompts/list→ all prompt template names, descriptions, and arguments
MCP vs an MCP configuration skill
| Aspect | endpoint-probe --mcp | MCP configuration skill | |
|---|---|---|---|
| Purpose | Discover what a server offers | Configure & use a server | |
| When | Before deciding to use a server | After deciding to use it | |
| Output | Tool schemas, resources, prompts | Registered tools in the agent's toolset | |
| Requires restart | No | Yes (agent restart to register) | |
| Transport | HTTP and stdio | HTTP and stdio |
Workflow: Use endpoint-probe --mcp to evaluate a server → decide if useful → use an MCP configuration skill to register it → restart the agent.
Common Pitfalls
- Base URL wrong or too specific.
https://api.example.comis correct;https://api.example.com/v1/users/123is too specific — the probe needs the root to discover paths. Strip trailing paths.
OpenAI-compatible APIs: If the base URL is an inference endpoint like https://provider.ai/v1 or https://provider.ai/zen/go/v1, the probe will find nothing because discovery paths (/openapi.json, /docs, etc.) are served from the domain root, not the inference prefix. Always probe the domain root (https://provider.ai) to find the OpenAPI spec and full API surface. The inference endpoints (/v1/chat/completions, /v1/models) are usually a small slice of a larger platform API.
- GraphQL introspection disabled. Many production GraphQL APIs disable introspection for security. The probe will show status 200/400/403 with "introspection disabled" — this confirms GraphQL exists but the schema is hidden. Try sending a simple query like
{"query": "{ __typename }"}to confirm.
- Auth-gated APIs return 404 instead of 401. Some APIs return 404 for unauthenticated requests to hide endpoint existence. If everything is 404, try providing
--authcredentials.
- Rate limiting during probe. The script makes ~80-100 requests concurrently (8 threads). Most APIs tolerate this, but if you hit 429s, increase
--timeoutor use--no-guessto reduce request count. The script auto-detects rate-limit exhaustion (viaX-RateLimit-Remaining: 0) and skips resource guessing to avoid false positives — check the report forrate_limited_skipped_guessing: true.
- Uniform 403 ≠ auth-gated. If every discovery path returns 403 with the same error body, you're rate-limited, not auth-blocked. Check rate-limit headers (
X-RateLimit-Remaining) before interpreting 403s as auth requirements. A true auth-gated API returns 401 (withWWW-Authenticate) or mixed 200/401/403 across paths, not uniform 403.
- 403 on `/graphql` means the endpoint exists. A 403 on
/graphqlconfirms the endpoint is there but introspection is blocked — not that GraphQL is absent. A 404 means the endpoint doesn't exist. Don't conflate the two.
- CORS headers only on OPTIONS. Some APIs only send CORS headers on OPTIONS preflight, not on GET. The probe checks OPTIONS separately for this reason.
- False positives on /health, /status. These paths may return 200 from a load balancer or CDN even if the API itself is down. Treat them as "something is listening" not "API is healthy".
- Server fingerprint unreliable.
X-Powered-Byis often stripped by proxies. The framework hints are best-effort — don't treat them as definitive.
- Self-signed certs. The script uses urllib which verifies certs by default.
PYTHONHTTPSVERIFY=0does NOT affect urllib (it only affectsrequests/httpx). Self-signed targets are currently unsupported — use--allow-privatefor internal hosts but self-signed TLS requires a future--insecureflag with a customssl.SSLContext.
- Concurrency is load-bearing. The probe script uses
concurrent.futures.ThreadPoolExecutor(max_workers=8)for both well-known paths and resource guessing. Sequential probing of ~90 paths times out against slow APIs (>120s). If you modify the script, preserve the thread pool — do not revert to sequential requests.
- SPA catch-all false positives. Next.js, Nuxt, and other SPA frameworks serve the same HTML page (200 +
text/html) for every path — including/api/users,/health,/openapi.json, etc. This floods the report with bogus "endpoints" that are just the SPA shell. The script auto-detects this in REST resource guessing (uniform 200 + text/html + similar body lengths → discarded) and guards SOAP detection (WSDL path returning text/html is not SOAP). However, the discovery-paths phase may still show manyhtml-docsentries — these are SPA routes, not real API docs. If the server fingerprint shows Next.js/Nuxt and most discovery paths return 200 text/html, treat all but the OpenAPI spec (if found) as SPA noise.
- MCP stdio server hangs. Some MCP servers don't exit cleanly on stdin close. The probe sends
terminate()then waits 5s beforekill(). If a server ignores SIGTERM, the probe may take 5s longer. This is expected — the probe always cleans up.
- Reports redact credential values, not auth protocol. Auth detection still surfaces scheme (
Bearer,Basic,WWW-Authenticate, “API key required”, cookie names). EchoedAuthorization/X-API-Keyvalues,Set-Cookievalues, and token-shaped strings in error bodies are replaced with***so reports/logs stay shareable. If a header looks “empty” of secrets, check for***— that means a secret was present and scrubbed.
- MCP protocol version mismatch. The probe sends protocol version
2025-06-18. Older MCP servers may use2024-11-05— the server negotiates and returns its supported version in the response. The probe reports the negotiated version in the summary. If initialize fails with a protocol error, the server may require an older version.
- MCP HTTP endpoint URL. MCP over HTTP uses a single endpoint URL (e.g.
https://mcp.example.com/mcp), not path-based routing. All JSON-RPC requests go to the same URL via POST. Don't append/tools/listor similar — the--mcpflag handles this correctly.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingresearch/endpoint-probe/SKILL.md
Popularity
- Repository stars
- 76
- Repository forks
- 12
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/moonlight-lupin/agent-skills/endpoint-probe)