This guide covers writing standards for Arcade documentation. It applies to both human contributors and AI assistants.
Vale handles mechanical style checks (grammar, passive voice, etc.). This guide covers what Vale cannot: voice, structure, terminology, and judgment calls.
- Do: "Create a tool by adding the
@tooldecorator" - Don't: "You might want to consider creating a tool by possibly adding the
@tooldecorator"
Assume readers know programming fundamentals. Don't explain what a function is, but do explain Arcade-specific concepts.
- Do: "You can configure the server with environment variables" or "Configure the server with environment variables"
- Don't: "Users can configure the server..." or "One can configure..."
- Do: "We contributed elicitation to the MCP standard."
- Don't: "We will now build our sample app..." or "Let's get started!" (These refer to the reader like they are part of the Arcade team.)
Documentation is not a sales pitch. State capabilities factually.
- Do: "Arcade handles OAuth token refresh automatically"
- Don't: "Arcade's amazing OAuth system seamlessly handles token refresh for you!"
Many TypeScript users are familiar with JavaScript or Python and may need things like "zod" explained on the spot.
| Use | Don't use |
|---|---|
| MCP server | MCP Server (unless starting a sentence), integration |
| tool | Tool (unless starting a sentence) |
| Arcade Engine | Arcade engine, the engine |
| auth provider | authentication provider (too long) |
| user authorization | user auth (spell it out) |
- Arcade
- Arcade Cloud
- Arcade Engine
- MCP (Model Context Protocol)
- tool, tools
- server, servers
- auth provider
- secret, secrets
- context
Each page should have a a 10/20/70 format:
- Open with a sentence or two briefly covering what the page explains.
- The first paragraph should answer:
- Who this page was written for
- What it's about
- Why the information is useful
- When you'll need it
- Where you'll be using it
- How to move forward
- The remaining content should take about 70% of the page and expand on the promise of the first paragraph
- Title - What this page covers (H1)
- Intro line - One sentence explaining what the reader will learn
- Prerequisites (if applicable) - What the reader needs before starting
- Main content - Organized with H2/H3 headings
- Next steps (if applicable) - Where to go from here
- Use sentence case: "Create an MCP server" not "Create an MCP Server"
- Be specific: "Configure OAuth scopes" not "Configuration"
- Start with a verb for task-based docs: "Create...", "Configure...", "Deploy..."
- Always show complete, runnable examples when possible
- Include imports
- Use realistic variable names, not
fooorbar - Add comments only when the code isn't self-explanatory
# Good
from arcade.sdk import tool
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""Send an email to the specified recipient."""
# Implementation here
return f"Email sent to {to}"
# Bad
from arcade.sdk import tool
@tool
def do_thing(x: str) -> str: # This does the thing
"""Do the thing."""
return x # Return the thing- Use bullet points for unordered items
- Use numbered lists only for sequential steps
- Keep list items parallel in structure
List what the reader needs:
- Required accounts (Arcade account, third-party service accounts)
- Required tools (CLI, SDK versions)
- Required knowledge (link to other docs if needed)
When showing code that can fail, show how to handle errors:
try:
result = client.tools.execute(tool_name="Gmail.SendEmail", inputs={...})
except ArcadeError as e:
print(f"Tool execution failed: {e}")When covering auth, secrets, or permissions, include security notes:
- Where credentials should be stored
- What scopes/permissions are actually needed (principle of least privilege)
- Any risks to be aware of
If there is anything that people are expected to progress to, include links to those pages here.
Link to related useful materials:
- Resources—Cheat sheets, sample apps
- Related Guides and Tutorials
- Further reading: blog posts, concepts
# Bad - the comment adds nothing
# Import the tool decorator
from arcade.sdk import tool- Do: Use
https://example.comor realistic-looking URLs - Don't: Use
https://your-url-here.comor<INSERT_URL>
- Do: "The token refreshes automatically when it expires"
- Don't: "The token refreshes automatically in about 5 minutes"
Avoid using language like "simple," "easy," "basic." It makes PhDs feel like the tool is too dumb and inexperienced engineers lose heart when they start to struggle although "it says this is easy..." Treat the reader and the tool with the neutral respect and dignity they both deserve. Don't infantilize them.
- Do: "Add the decorator to your function"
- Don't: "Simply add the decorator to your function"
When explaining how something works, keep it brief and link out to the official docs.
Use the appropriate callout type:
<Note>- Additional helpful information<Warning>- Something that could cause problems<Tip>- Optional improvement or shortcut
- Use relative links for internal docs:
[auth providers](/references/auth-providers) - Use descriptive link text: "See configuring OAuth" not "See here"
- Always specify the language:
```python,```typescript,```bash - Use
title="filename.py"when showing file contents - Use
{1,3-5}to highlight specific lines when needed
If you're an AI assistant fixing Vale-flagged issues:
- Preserve technical accuracy - Don't change code or technical details
- Keep the author's intent - Reword, don't rewrite
- Fix only what's flagged - Don't make unrelated improvements
- For passive voice - Only fix if active voice is clearer; passive is sometimes better for technical writing
- For toxic language flags - Always fix these, even if it means rewording significantly