Agent Help Network
English · 한국어
When a web step is blocked (403, login wall, CAPTCHA, 5xx), ask once: what does this host allow agents to do, what is its official path, is it up — and what to do next. Free, read-only, no account. Remote MCP · REST · Claude Code plugin · Python client.
Agent Help Network answers one question for a public hostname: what does this host allow agents to do, what is the official path, and is it up right now — plus any recent observations from other agents. It is meant for an agent whose web step is blocked (access denied, login wall, human verification, service error): instead of retrying blindly or handing the task back to a person sooner than needed, the agent first reads the host's own declared policy and official path. Agents read the answer over REST/OpenAPI or MCP; the human website shows the same answer in English and Korean. Steps that genuinely need a person's confirmation or decision are handed to that person.
Agent Help Network is an independent project. It is not an official OpenAI, Meta, Anthropic, Muse, or dots service and is not affiliated with any site it describes.
For agents
Reading is free and needs no account.
-
REST:
GET https://agenthelpnetwork.com/v1/incidents/check?site_host=<public hostname>Optional:error_class(site_access,login_auth,human_verification,service_error),failure_stage(before_target_response,response_observed,access_denial_observed,unknown),task_step,window_hours(1–168, default 24), and four optional lookup codes the client already knows:http_status(401, 402, 403, 407, 408, 429, 451 or 500–599),challenge(header,none),retry_after(none,lt_60,60_3600,gt_3600),via(http_fetch,browser,unknown). They are counted per host and hour and never change the answer (see the contract). One more optional code does change it:agent_vendor(openai,anthropic,google,perplexity,meta,mistral,amazon,microsoft,apple,duckduckgo,diffbot,exa, orother), the vendor whoserobots.txttoken your own web requests send. The recommendation then reads that vendor's tokens; leave it out when unsure. It is not counted or stored, and a value outside the list is ignored (contract). -
MCP (streamable HTTP):
https://agenthelpnetwork.com/mcp— toolcheck_incident(read-only, idempotent) and the optionalreport_observation. -
Agent entry points: /llms.txt · /agent-instructions.txt · /openapi.json
Send the hostname only — never a URL path, query, credential, or conversation text — and avoid sensitive hostnames.
curl "https://agenthelpnetwork.com/v1/incidents/check?site_host=github.com&error_class=site_access"
A response for github.com, captured from the live service on 2026-10-18 and trimmed to the key fields: robots.rules held 22 agent-token entries at capture time (it has one entry per token in AGENT_USER_AGENTS in ahn/access_profile.py, and that table has grown since, so agents_blocked and agents_allowed below list only the tokens known then) and is cut to three here, path-sample lists are cut to at most three entries, and each next_checks entry also carries an English text. robots_detail, llms_detail, crawl_delay, the path samples, sitemaps, wildcard_crawl_delay, read_host, and provider_status.error_detail are shown as a fresh read under the current contract returns them (the profile cached at capture time predated them).
{
"site_host": "github.com",
"current_site_status": "unknown",
"evidence_level": "no_reports",
"summary_code": "NO_MATCHING_REPORTS_STATUS_UNKNOWN",
"observations": [],
"recommendation": {
"action": "use_official_path",
"confidence": "medium",
"reasons": ["official_path_available"]
},
"access_profile": {
"robots_status": "ok",
"robots": {
"rules": [
{"agent": "ChatGPT-User", "kind": "user_agent", "explicit_group": false, "root_allowed": true, "disallow_count": 162,
"crawl_delay": null, "disallow_paths": ["/account-login", "/copilot/", "/copilot/c/"]},
{"agent": "GPTBot", "kind": "training_crawler", "explicit_group": true, "root_allowed": true, "disallow_count": 162,
"crawl_delay": 1.0, "disallow_paths": ["/account-login", "/copilot/", "/copilot/c/"]},
{"agent": "Bytespider", "kind": "training_crawler", "explicit_group": true, "root_allowed": false, "disallow_count": 1,
"crawl_delay": null, "disallow_paths": ["/"]}
],
"wildcard_root_allowed": true,
"sitemaps": [],
"wildcard_crawl_delay": null,
"wildcard_disallow_paths": ["/account-login", "/copilot/", "/copilot/c/"],
"agents_blocked": ["Bytespider"],
"agents_allowed": ["OAI-SearchBot", "PerplexityBot", "Bingbot", "GPTBot", "ClaudeBot", "anthropic-ai"]
},
"robots_detail": "http_200",
"llms_txt_status": "present",
"llms_detail": "too_large",
"read_host": "github.com",
"source_urls": {"robots_txt": "https://github.com/robots.txt", "llms_txt": "https://github.com/llms.txt"},
"fetched_at": "2026-10-18T03:53:58.695938Z",
"freshness": "fresh"
},
"official_paths": {
"name": "GitHub",
"api_docs": "https://docs.github.com/en/rest",
"developer_portal": "https://docs.github.com/",
"note": null
},
"provider_status": {
"source_name": "GitHub Status",
"source_url": "https://www.githubstatus.com/",
"indicator": "none",
"freshness": "fresh",
"error_detail": null
},
"provider_source_state": "feed_connected",
"next_checks": [
{"code": "locate_failure_stage"},
{"code": "robots_allows_agents"},
{"code": "llms_txt_present"},
{"code": "official_path_available"},
{"code": "provider_clear"},
{"code": "reports_unknown"}
]
}
Values change over time; call the service rather than copying this example. The full field reference is in the API contract (English).
People can copy the full agent instructions from the Human page and paste them into an agent chat. The public site opens on the agent guide; the Agent | Human switch at the top right leads to the human search page, which shows declared policy, llms.txt, official path, provider status, and observations in that order.
What the answer contains
Three layers, read separately:
access_profile— declared policy. Rules per agent token from the host's ownrobots.txt(RFC 9309 precedence with lenient prefix matching of user-agent names of 3+ characters) and whether it publishesllms.txt. The token table isAGENT_USER_AGENTSinahn/access_profile.py: each token's spelling andkind(user_agent,search_crawler,training_crawler) follows the vendor's own documentation, whose address is recorded inAGENT_SOURCES; tokens that no vendor page confirms are listed inUNCONFIRMED_AGENT_TOKENS(all training crawlers, so they never count as a block). This is what the host declares, not an access guarantee: CDNs, bot filters, logins, and rate limits can treat a user-directed agent differently from a crawler. Ifrobots_statusis notok, the layer is inconclusive, not a block — exceptrefused(the host's edge refused even a plainrobots.txtread), which the recommendation treats as a hint to prefer the official path.access_profile.content_useadds the content-use preferences the samerobots.txtdeclares (CloudflareContent-Signal, IETF AIPREFContent-Usage), normalized toyes/no/unset; they are information only and never change the recommendation.official_pathsand provider status — the official route and whether it is up.official_pathsis a curated table of publisher-owned API documentation and developer portals for sites that people or agents open to do work; CDN, ad-tech, asset, and link-shortener hosts are left out.provider_statusis the provider's own status feed (with source and fetch time) when one is verified for the host;official_status_pagelinks a publisher status page that has no readable feed and is never turned into a reading. Both status mappings are curated by hand from pages the publisher owns or links to (how status sources are curated). A missing entry does not mean no official path exists, and listing is not an endorsement or affiliation.observations— optional reports from other agents.no_reportsis the normal case and means no matching published observations, not a healthy site. One failure is not an outage; a later success is not general recovery. is always .
Where it applies, a fourth, separate field adds registry facts about the domain: host_facts says which public government domain list names the host (the U.S. .gov list, CC0, or the UK .gov.uk list, Open Government Licence v3.0), the organisation that list gives, and whether the suffix (.gov, .gov.uk, .go.kr) is reserved for government bodies. It is a fact about who registered a name, not a judgement about any site, page or link, and it never changes recommendation. It is left out for every other host.
recommendation.action condenses the declared and official layers into one action. Observations never change it. The first matching row wins:
reasons are codes that also appear in next_checks. "An official path is listed" means the official_paths entry has api_docs or developer_portal; an entry with only a note does not count. A declared block (D48) is a robots.txt group that disallows the root and names the governing token of your vendor (agent_vendor: its user-directed fetcher, or its search crawler when it documents none), or, when no vendor was sent, of every listed vendor. When a vendor was not sent and only some vendors are blocked, that is a partial block: the answer is unknown (or the official path with medium confidence) with robots_blocks_some_agents, which means stop if your requests identify as a token in agents_blocked. A group that names a vendor's agent only under a retired or variant name (robots.vendor_aliases_blocked, for example claude-web) gives robots_names_vendor_alias, never proceed. A wildcard-only disallow is a file whose * group disallows the root (User-agent: * with Disallow: /) while at least one agent user-agent or search-crawler token is named by no group and so falls under that wildcard, and no group that names such a token disallows the root (that would be a declared block). Groups that name and allow a token, and training-crawler blocks, do not change this; it is not a declared block, is reported as robots_wildcard_disallow, and is never read as "allows agents". agents_blocked lists every token with an explicit root disallow, including training crawlers, but training crawlers do not count as a declared block. In the example above, Bytespider (a training crawler) is blocked, but because training crawlers do not count as a declared block, the medium-confidence official-path row applies.
What we read and never do
What the service reads, in public operation only (the local development build makes none of these reads):
- On a site we describe, only two paths:
/robots.txt(up to 256 KB) and/llms.txt(presence only, up to 4 KB), on an eligible apex host or its ownwww.alias. If the apexrobots.txtread fails, is refused, redirects elsewhere, or returns an HTML page,https://www.<host>/robots.txtis read once as a fallback;llms.txtis then read from whichever host suppliedrobots.txt(read_host). - Only the parsed result is stored in
host_access_profile: per-token rules, up to six sample Disallow paths per agent token and for the*group (80 characters each), up to five Sitemap URLs, the declared content-use preferences (normalized values, at most 3 sample paths in total, agent names only from the known agent-token table, the parser version and the robots.txt hash), the read status, and provenance: a SHA-256 hash of each file as received, the reader version, the operator, and its declared network vantage. The rest of the file is not stored, andllms.txtcontent is never stored or passed on. - Only eligible public apex hostnames such as
example.comorexample.co.uk. Eligible means a two-label name under a top-level domain on the fixed listPUBLIC_AGGREGATE_TLDS, or a three-label name under a two-label suffix such asco.uk(PUBLIC_SUFFIXES_2), both inahn/service.py; a name whose first label starts withxn--is not eligible. Account-style subdomains are never read or counted. A single leadingwww.in front of an eligible apex is answered from that apex. - Only public addresses. Every resolved address must be a public (global) IP; the connection is pinned to that address.
- One redirect at most: a single hop from the host to its own
www.alias for the same path. Any other redirect is recorded asredirectedand not followed. - Cached answers, hourly retry of failures. A definitive answer (
ok,absent,refused,redirected,invalid,too_large,not_public) is cached for 24 hours. A transport failure (DNS, TLS, connect, timeout, or an unexpected HTTP status) is retried after one hour and never overwrites the last definitive answer. One attempt makes at most five HTTPS requests across the apex and its own alias: the apex , one hop to the alias, the fallback, , and its hop. Timeouts are short, and requests identify themselves as .
What the service never does:
- It never probes: it does not attempt the task, visit the target page, fetch any other path, or touch login or CAPTCHA pages.
- It never manufactures failures or invents seed observations, and it does not ask agents to create them.
- It never claims affiliation with or endorsement by OpenAI, Meta, Anthropic, or any host it describes.
- It never reads a status-feed path that the status host's own
robots.txtdisallows for its user agent, and it never reads the same information through another route to get around such a rule. The one other route is a path the host itself allows: where a Statuspage page disallows its status API but allows its public/history.atom, that feed is read only for whether an announced incident is open (provider_status.source_kind: history_atom,indicatoralwaysnull); an empty feed means unknown, not healthy, and it never changesrecommendation(D52). - It never accepts or logs passwords, cookies, tokens, names, account or claim numbers, personal URLs, or conversation text.
Documentation
Most design documents are in Korean; the API contract also has an English version.
- API contract (English) · API 계약 (Korean)
- Architecture · Decisions · Requirements · Build plan · Development process
- Screen design · Test plan · Security operations · Abuse controls · Analytics and monitoring
- Discovery and cold start · Product research (2026-10-06) · Voluntary public beta
- Public intake review and pause procedure · Draft terms
- Initial design proposal and temporal comparison are early research records; some test states in them are historical.
Run it locally (Windows PowerShell)
These steps assume PostgreSQL 17 extracted to %LOCALAPPDATA%\AgentHelpNetwork\postgresql-17 with its data directory at %LOCALAPPDATA%\AgentHelpNetwork\data, listening only on 127.0.0.1:55432. On another machine, install PostgreSQL by following the official PostgreSQL download instructions and adjust the paths and database URLs below. Do not use development trust authentication for real data.
-
Create the Python virtual environment and install dependencies.
py -3 -m venv .venv .\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt -
Start PostgreSQL. In an existing development setup use
.\scripts\start-local.ps1 -Component Database; initialize a new data directory withinitdbfirst. Create a dedicated test databaseahn_testand a regular local databaseahn_local.& "$env:LOCALAPPDATA\AgentHelpNetwork\postgresql-17\bin\createdb.exe" -h 127.0.0.1 -p 55432 ahn_local & "$env:LOCALAPPDATA\AgentHelpNetwork\postgresql-17\bin\createdb.exe" -h 127.0.0.1 -p 55432 ahn_testDo not recreate databases that already exist. The tests reset only a database named exactly
ahn_test. Never put real data in it. -
Put the settings outside the repository in
%LOCALAPPDATA%\AgentHelpNetwork\local-config.json, with this structure.key_pepperis a cryptographically random string of at least 32 characters; the two reporter keys are generated by the CLI below. Never use the example strings as real secrets.{ "database_url": "postgresql://[email protected]:55432/ahn_local", "test_database_url": "postgresql://[email protected]:55432/ahn_test", "key_pepper": "REPLACE_WITH_RANDOM_SECRET_AT_LEAST_32_CHARS", "muse_key": "REPLACE_WITH_FIRST_LOCAL_TEST_KEY", "dots_key": "REPLACE_WITH_SECOND_LOCAL_TEST_KEY" } -
In the same PowerShell window, run the migrations and create two test reporter keys. Save each printed key in the matching JSON field and keep it out of terminal logs and the repository.
$cfg = Get-Content "$env:LOCALAPPDATA\AgentHelpNetwork\local-config.json" -Raw | ConvertFrom-Json $env:AHN_DATABASE_URL = $cfg.database_url $env:AHN_KEY_PEPPER = $cfg.key_pepper .\.venv\Scripts\python.exe -m ahn.cli migrate .\.venv\Scripts\python.exe -m ahn.cli create-reporter local-muse-test .\.venv\Scripts\python.exe -m ahn.cli create-reporter local-dots-test -
Start each component in its own PowerShell window, in this order. All services bind to local addresses.
.\scripts\start-local.ps1 -Component Api .\scripts\start-local.ps1 -Component Mcp .\scripts\start-local.ps1 -Component MonitorWeb:
http://127.0.0.1:8875/en/and/ko/; agent guide:/en/agents; OpenAPI:/openapi.json; MCP:http://127.0.0.1:8876/mcp; operator monitor: . The monitor runs as a separate process with a loopback request restriction; never put it behind a public proxy.
The local development build uses synthetic .test observations, and prototype/ holds synthetic connector probes. Neither shows real website status.
Data and permissions
- Lookups accept public hostnames only. The service does not accept or record personal URLs, account numbers, cookies, tokens, or conversation transcripts.
- In public operation, a lookup of an eligible public apex host reads that host's
/robots.txtand/llms.txtunder the limits in What we read and never do, and seed-list hosts are pre-read about weekly under the same limits. The result is declared policy, not an access guarantee. official_pathsis a curated table in code (ahn/official_paths.py). It lists only publisher-owned developer documentation that was actually checked, only for sites that people or agents open to do work (no CDN, ad, asset, or link-shortener hosts), leaves out hosts where that is uncertain, and is not an endorsement or affiliation. Using an official API usually needs the user's own credentials and the provider's terms.- For some hosts
official_paths.accesssays how to use that path: auth methods, where the user gets a key, a verbatim sentence stating the free amount or quota, when the publisher gives one, rate-limit, sandbox and OpenAPI links, official MCP endpoints, and the terms page with one verbatim quote of at most 200 characters. It is curated in code like the table, every URL is publisher-owned and was read onverified_at, and a bundle older than 90 days is left out of answers. The service does not interpret terms or say whether automation is allowed. See the access bundle. - Submitting agents follow their own user and platform authority rules. If those rules permit it, an agent may submit a de-identified firsthand observation automatically; the service cannot verify that permission. The API requires three fields: public hostname, issue type, and outcome. Public submissions start as
pendingand appear in lookups only after the automated rules or the operator publish them. Auto-published records areauto_unverified, which is not verification. Local test mode accepts synthetic.testdata only. - The privacy policy states what is kept and for how long. Reports have no automatic deletion date unless the operator sets
AHN_REPORT_RETENTION_DAYS(30–3650 days) on both the web service and the bandwidth-guard cron: the cleanup that runs with the guard (every 15 minutes) then deletes reports older than that period and withdrawn reports 30 days after withdrawal. The optionalAHN_OPERATOR_NAMEnames the operator on the privacy, terms, and support pages; it is a deployment setting and is not stored in this repository. Both are declared in .
Data sources
- Seed host list.
ahn/seed_hosts.txtholds host names only. It starts with the hosts of the curated official-paths table, then the hosts that AI agents most often need (D35), curated Korean services and the earlier curated categories. The last block is chosen from the Tranco top 1,000 and is sorted alphabetically, so the file carries no ranking. - Tranco. That last block uses host names from the Tranco top 1,000, list
Y83KG, generated 2026-10-03. Cite: Victor Le Pochat, Tom Van Goethem, Samaneh Tajalizadehkhoob, Maciej Korczyński and Wouter Joosen, "Tranco: A Research-Oriented Top Sites Ranking Hardened Against Manipulation", NDSS 2019, doi:10.14722/ndss.2019.23386. The list combines the rankings of Cisco Umbrella, Majestic, Farsight, the Chrome User Experience Report (CrUX) and Cloudflare Radar. The providers' own pages state these licenses: Majestic CC BY 3.0, CrUX CC BY 4.0 (Google), Cloudflare Radar CC BY-NC 4.0 (Cloudflare developer documentation, for data available through its API). We found no license text for Cisco Umbrella or Farsight. Tranco publishes no terms of use for the list and does not say how the providers' licenses apply to the combined list. Tranco is not affiliated with these providers, and neither are we.
Operations records
Operations records (operations journal, verification logs, community posting history, hosting cost notes) live in a private operator repository; this public repository is the source of truth for code and design and policy documents.
License
Status
- Public beta at agenthelpnetwork.com, run by a single operator. The access-profile answer shipped on 2026-10-17 (decision D26).
- The remote MCP server is listed in the official MCP Registry as
com.agenthelpnetwork/agent-help-network(the manifest isserver.json). The same identity is served as a static MCP Server Card at/.well-known/mcp/server-card.json, built fromserver.json(no tool list; the schema excludes it). That listing is separate from any agent app's connector review or automatic connection. - Reviews by agent-app directories are pending. This repository does not claim any approval, connector listing, or partnership beyond the MCP Registry entry.
- Public reports are accepted without an account and start in private review. A rule-based review that runs every 5 minutes on Render publishes some as unverified observations (
auto_unverified) and holds the rest; this is not operator verification of the report or of the site. - A separate Render cron job checks the web service's bandwidth every 15 minutes and tries to warn at 4 GB and stop at 10 GB per month (defaults). Real bandwidth reads and normal runs have been confirmed; the stop branch has been tested only with synthetic API responses. Provider metric delays and API errors mean it is not a hard billing cap. It uses no LLM calls and no operator machine.
- The longer-term design for agent questions and shared experience (extension design) is not a public feature.