Open Source
Charlotte
An MCP server that turns web pages into structured, text-native representations for AI agents, and our reference implementation for LEAN across all four layers.
ASM · ACP · LEAN
Will your site still work when there is no screen and no human?
Can you allow autonomous agents to transact while still blocking unwanted traffic?
robots.txt cannot answer either question. Its entire vocabulary is an allow or deny rule per user-agent and path, so it cannot express a rate limit, a conditional permission, or the actions a site supports. It is also non-binding on exactly the traffic that matters most: two of the three major AI vendors document that their user-directed fetchers may or do ignore it.
Deploy /.well-known/agents.json and every agent on the internet can discover your site and call your APIs, with no SDK, no local server and no context injection at startup.
{ "version": "1.0","site": { "name": "...", "description": "...", "capabilities": { ... }, "navigation": { ... } },// ASM: site-level manifest"services": { "name": "...", "auth": { ... }, "tools": [ ... ] }// ACP: service-level protocol}
A website with no API only needs the site block, a headless API only needs the services block, and a full product carries both.
Site-level · the site block
ASM tells agents what your site is, what it offers, and how to behave. It replaces the guesswork agents currently do (fetching your homepage, parsing navigation, inferring capabilities) with a single structured declaration.
A three-tier model that goes beyond the binary allow or block of robots.txt:
ASM includes a measurement system that scores agent-readiness across six weighted dimensions, ordered so that a site failing Content Survivability cannot score well on anything downstream.
Service-level · the services block
ACP defines how services advertise their capabilities to AI agents. Instead of requiring agents to run local adapter servers, the service hosts a structured manifest that agents fetch at runtime before calling the API directly over HTTPS.
The service bears the cost of describing itself rather than pushing it onto the agent, and one JSON file is enough for every agent on the internet to consume it.
"services": {
"name": "Your API",
"base_url": "https://api.example.com/v1",
"auth": {
"type": "bearer",
"instructions": "API key as Bearer token."
},
"tools": [
{
"id": "do_thing",
"description": "Does the thing.",
"endpoint": "/thing",
"method": "POST",
"input": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" }
}
}
}
]
}The current model for agent-service integration requires agents to run a local server for every service they use. Each server injects tool definitions into the agent's context window, consumes local resources, and has to be maintained by the consumer. ACP inverts this.
| Comparison | MCP | ACP |
|---|---|---|
| Who runs the adapter? | The agent (consumer) | Nobody. It is a JSON file. |
| Tool definitions live... | Injected into context at startup | Fetched on demand from service |
| What runs locally? | A server process per service | Nothing |
| Who maintains it? | The consumer | The service provider |
| Scaling to 50 services? | Poorly | Same as 1 service |
ACP does not replace MCP for local tools (file system, databases, IDE integration), private integrations behind firewalls, or use cases requiring persistent bidirectional connections. For public services with REST APIs, ACP is simpler.
Design philosophy · guides authoring of both ASM and ACP
Every token an agent carries costs money and displaces reasoning capacity, so LEAN replaces “send everything, let the agent filter” with “send the minimum, let the agent expand.”
Default Minimal
Initial responses contain the smallest useful representation.
Depth on Demand
Full details remain one request away, never forced.
Reversible Depth
Agents can expand and contract their context.
Layer Independence
Detail at one layer does not force breadth at another.
State Consistency
Expanding or contracting never corrupts state elsewhere.
See Charlotte, the open-source reference implementation, for LEAN applied across all four layers.
Read the LEAN SpecCreate /.well-known/agents.json with your site's basic information and agents can discover you from that one file.
{
"version": "1.0",
"site": {
"name": "Your Site Name",
"description": "What your site does in one sentence.",
"primary_language": "en",
"contact": "https://yoursite.com/contact",
"capabilities": {
"actions": [
{
"id": "contact",
"description": "Send a message via contact form.",
"entry_point": "/contact",
"method": "form_submit"
}
]
},
"navigation": {
"sections": [
{ "name": "Home", "path": "/" },
{ "name": "About", "path": "/about" },
{ "name": "Services", "path": "/services" }
],
"sitemap": "/sitemap.xml"
},
"access": {
"public_content": true
},
"agent_policy": {
"tier2_allowed": true,
"tier3_allowed": true,
"crawl_delay_seconds": 1,
"max_requests_per_minute": 30
}
}
}1
Create the file
2
Fill in your details
3
Deploy it to /.well-known/
The reference implementation our founder builds and maintains against these specs.
Enter your domain and we will run a free Level 1 compliance check against the ASM spec.