Everything this host exposes to a program, in one page. It is a short list, and the short parts are stated as plainly as the rest.
The homepage registers four read-only WebMCP tools from a server-rendered inline script, so a browsing agent can call them without a separate server: agentify_overview, agentify_when_to_use, agentify_readiness_layers, and agentify_how_to_request_access. The last one deliberately returns the request contract instead of submitting it — lodging a request emails a human, and that is the caller's decision to make.
POST /api/request-access is the entire callable write surface. No API key, no OAuth, no bearer token: it is a public form endpoint with a rate limit.
curl -X POST https://agentify-skill.vercel.app/api/request-access \
-H 'Content-Type: application/json' \
-d '{
"kind": "access",
"email": "you@example.com",
"company": "Example Inc",
"github": "your-github-username",
"note": "What you would actually use agentify for."
}'
curl -X POST https://agentify-skill.vercel.app/api/request-access \
-H 'Content-Type: application/json' \
-d '{
"kind": "consultation",
"email": "you@example.com",
"company": "Example Inc",
"goal": "What you are trying to reach."
}'
| Field | Required | Max | Notes |
|---|---|---|---|
kind | no | — | access (default) or consultation. Any other value is treated as access. |
email | both kinds | 200 | Must look like an address. |
company | both kinds | 200 | Company or project. |
github | access only | 40 | A real GitHub username: alphanumeric and hyphens, 1–39 chars, no leading, trailing or consecutive hyphens. The repo invite goes here. |
note | optional | 1500 | access only. |
goal | consultation only | 1500 | What you are trying to reach. |
| Status | Body | Means |
|---|---|---|
| 200 | {"ok":true} | Lodged. A human will read it. |
| 200 | {"ok":true,"deduped":true} | Same email and kind within 10 minutes. No second mail was sent. Not an error, and not a reason to retry. |
| 400 | {"error":"missing_fields"} | The response names which ones. |
| 400 | {"error":"invalid_email"} | Address did not parse. |
| 400 | {"error":"invalid_github_username"} | Not a valid GitHub username. |
| 400 | {"error":"field_too_long"} | A field exceeded the limits in the table above. |
| 405 | {"error":"method_not_allowed"} | Anything other than POST. Allow: POST is set. |
| 429 | {"error":"rate_limited","retry_after_seconds":60} | More than 3 requests in 60 seconds from your IP. Retry-After: 60 is set — honour it. |
| 502 | {"error":"notification_failed"} | The request was valid and the mail did not send. Retry once, then use the LinkedIn route on the contact page. |
The rate limiter and the deduplicator are per-container and in-memory, so under load they are best-effort rather than exact. Treat the documented limits as the contract and do not probe for the seams.
Stated plainly, because an agent that assumes otherwise wastes a request and a scanner that assumes otherwise scores us for something we did not build.
/api/mcp. Any MCP package that resolves against the parent hosting domain belongs to the hosting provider, not to agentify./.well-known/agent-card.json is a static description; there is no JSON-RPC task transport behind it.This page and the rest of the marketing site may be read, indexed, cited and used as AI training input; /robots.txt says so per crawler, and that is a deliberate choice to maximise reach rather than an oversight. The skill it markets is proprietary and is not covered by that permission. Missing paths return a real 404 with a markdown recovery body, so you can distinguish a typo from an outage without parsing HTML.