ask-docs

$npx mdskill add crewAIInc/skills/ask-docs

Answer CrewAI questions from the official documentation, matched to the crewai version the user actually runs.

SKILL.md

.github/skills/ask-docsView on GitHub ↗
---
name: ask-docs
description: "Query the official CrewAI documentation for answers. Use when the user has a CrewAI question that isn't fully covered by the getting-started, design-agent, design-task skills — e.g., specific API details, configuration options, advanced features, troubleshooting errors, enterprise features, tool references, or anything where the latest docs are the best source of truth."
---

# Ask CrewAI Docs

Answer CrewAI questions from the official documentation, matched to the crewai version the user actually runs.

Verified against crewai 1.15.23 and the docs sites below on 2026-10-01.
Live-tested with real LLMs on 2026-10-01.

There are two documentation sites:

| Site | Covers | Index | MCP server |
|---|---|---|---|
| `docs.crewai.com` | The open-source framework: agents, crews, tasks, flows, memory, knowledge, LLMs, tools, CLI, testing, telemetry, observability, and the AMP REST API reference (`/inputs`, `/kickoff`, `/status`, `/resume`) | `https://docs.crewai.com/llms.txt` | `https://docs.crewai.com/mcp` |
| `docs-platform.crewai.com` | CrewAI AMP (the hosted platform): deploying, automations, triggers, RBAC, secrets, Studio, platform API | `https://docs-platform.crewai.com/llms.txt` | `https://docs-platform.crewai.com/mcp` |

Old `docs.crewai.com/en/enterprise/...` links redirect to `docs-platform.crewai.com/platform/en/...` - to the matching page when it still exists (as HTML, even from a `.md` URL), otherwise to the platform introduction. Look platform topics up on `docs-platform.crewai.com` directly; its pages also serve Markdown with a `.md` suffix.

---

## When to Use This Skill

- A CrewAI feature, parameter, or behavior that the other skills do not cover
- Another skill says "re-verify with ask-docs" because the user's `crewai version` differs from the version that skill was checked against
- Current API syntax, method signatures, or configuration options
- An error message that may be covered by a troubleshooting note or caveat in the docs
- Less common features: telemetry, observability integrations, CLI commands, the tools library, AMP platform features
- Experimental conversational Flows (`handle_turn()`, `ConversationConfig`, `RouterConfig`, tracing, streaming)

**Use a sibling skill first** when it covers the topic. They hold curated guidance checked against crewai 1.15.x:

| Topic | Skill |
|---|---|
| Project scaffolding, choosing `LLM.call()` / `Agent` / `Crew` / `Flow` | getting-started |
| Agent role/goal/backstory, LLMs, memory, knowledge | design-agent |
| Task descriptions, `expected_output`, guardrails, structured output | design-task |
| Current 1.15.x API versus remembered 0.x API | check-crewai-api |
| Flow state, `@start` / `@listen` / `@router`, persistence | build-flow |
| Custom tools, `crewai_tools`, MCP servers for agents | connect-tools-and-mcp |
| Testing crews and flows with pytest, `crewai test` | test-crewai-project |
| Deploying to CrewAI AMP | deploy-to-amp |
| Calling a deployed crew over HTTP (`/kickoff`, `/status`, webhooks) | call-deployed-crew |

Use ask-docs for the gaps, and to re-check a sibling's version-sensitive rows.

---

## How to Query the Docs

Use the first path that is available.

### Path A: the docs MCP server (if configured)

The `docs.crewai.com/mcp` server needs no authentication. It exposes:

| Tool | Use |
|---|---|
| `search_crew_ai(query, version?, language?)` | Semantic search. Returns titled chunks with a `Link` per chunk |
| `query_docs_filesystem_crew_ai(command)` | Read-only shell (`rg`, `head`, `ls`, `tree`) over a virtual tree of every page and OpenAPI spec |
| `submit_feedback(path, feedback)` | Reports a docs problem to the docs team. Do not call it unless the user asks |

In Claude Code the tools appear as `mcp__<server-name>__search_crew_ai` (for example `mcp__crewai-docs__search_crew_ai`). The platform server has the same shape with a `_platform` suffix: `search_crew_ai_platform`, `query_docs_filesystem_crew_ai_platform`.

Rules:

- **Always pass `version`** with a leading `v`, e.g. `"version": "v1.15.23"`. Without it, results mix `edge` and every hosted release (1.10.0 onward), often old ones first. `"1.15.23"` without the `v` returns "No results found".
- The filesystem is laid out as `/<version>/<lang>/<path>.mdx` (`/v1.15.23/en/concepts/knowledge.mdx`, `/edge/en/...`) plus `/openapi/<version>/enterprise-api.en.yaml`. `rg -l "restore_from_state_id" /v1.15.23/en` finds every page that mentions a symbol.
- Search results can be large (60 KB+). Prefer a focused query, then `head -120 <file>` on the page you need.
- A call occasionally fails with "Search failed". Retry once before falling back to Path B.

### Path B: llms.txt and Markdown pages (no setup)

1. Fetch the index:
   ```
   WebFetch: https://docs.crewai.com/llms.txt
   ```
   It is about 220 lines of `- [Title](https://docs.crewai.com/v1.15.23/en/<path>.md): description`, under `## Docs`, followed by `## OpenAPI Specs` (the AMP REST API YAML). The index has no category headings: find the page by title, or by path prefix (`/en/concepts/`, `/en/guides/`, `/en/learn/`, `/en/tools/`, `/en/mcp/`, `/en/observability/`, `/en/api-reference/`).
2. Fetch the page with the `.md` suffix, which returns clean Markdown (about 30 KB) instead of the rendered HTML (about 850 KB):
   ```
   WebFetch: https://docs.crewai.com/en/<path>.md
   ```
   An unversioned `/en/...` URL redirects to the latest release (`/v1.15.23/en/...` on 2026-10-01).
3. For AMP platform questions, use `https://docs-platform.crewai.com/llms.txt` the same way. It is organised by heading (Getting Started, Build, Operate, Manage, Integration Docs, Triggers, How-To Guides, API Reference).

`https://docs.crewai.com/llms-full.txt` is every page in one file (about 2 MB). Do not load it into context. Download it and search it (`curl -s ... | grep -n -A20 "restore_from_state_id"`) when the index does not point to the right page.

For conversational Flows, go straight to `https://docs.crewai.com/en/guides/flows/conversational-flows.md`. Treat it as the source of truth for the conversational API (imported from `crewai.flow`; `crewai.experimental.conversational` is a deprecated alias of the same module), which may still change.

### Path C: GitHub source of the docs

The docs live in the public `crewAIInc/crewAI` repo under `docs/<version>/<lang>/<path>.mdx`, e.g. `https://raw.githubusercontent.com/crewAIInc/crewAI/main/docs/v1.15.23/en/concepts/knowledge.mdx` or `.../docs/edge/en/...`. The older `docs/en/...` layout no longer exists (404). Use this only when the docs site is unreachable.

---

## Match the docs to the user's version

1. Run `crewai version` (or `uv run python -c "import crewai; print(crewai.__version__)"` in a uv project).
2. Read the docs for that release: the URL prefix `https://docs.crewai.com/v<X.Y.Z>/en/<path>.md`, or `version: "v<X.Y.Z>"` on the MCP server. Releases from 1.10.0 onward are hosted, plus `edge` (unreleased main). Only the root `llms.txt` exists - `/v<X.Y.Z>/llms.txt` is a 404 - so take the path from the root index and swap the version prefix.
3. If the user's release is not hosted, read the nearest hosted one and say so. A non-hosted version does not 404: `/v1.9.0/en/concepts/knowledge.md` redirects to the home page with status 200, so check that the page you got is the page you asked for.

---

## Check docs snippets against the installed package

The docs are the best index of what exists, not proof that a snippet runs. For example, check decorator call forms such as `@persist()` against the installed version.

Before giving the user code that matters:

- Check signatures against the installed package: `python -c "import inspect, crewai.flow.flow as m; print(inspect.signature(m.Flow.kickoff))"`.
- Run the smallest snippet that exercises the claim, if it needs no API key.
- If the docs and the package disagree, say so, give the version that works, and cite both. The check-crewai-api skill lists known differences between remembered and current APIs.

---

## Workflow Summary

1. **Understand the question** - which concept, API, or behavior, and which crewai version?
2. **Pick the site** - framework (`docs.crewai.com`) or AMP platform (`docs-platform.crewai.com`).
3. **Query** - MCP with `version` set, or `llms.txt` then the `.md` page for that version.
4. **Check it** - signatures or a small run against the installed package when code is involved.
5. **Answer and cite** - give the docs URL (with the version prefix) so the user can read further.

---

## Worked examples (checked 2026-10-01 against crewai 1.15.23)

| Question | Where the answer is | What the docs say, checked |
|---|---|---|
| "How do I persist a flow?" | `/en/guides/flows/mastering-flow-state.md`, `/en/guides/flows/inputs-id-deprecation.md` | Decorate the Flow class (or a method) with `@persist()` from `crewai.flow.persistence`; state needs an `id`. `kickoff(restore_from_state_id=...)` forks from a saved state under a new `state.id`; `kickoff(inputs={"id": ...})` resumes under the same id and is documented as deprecated (1.15.23 emits no warning). Both ran locally |
| "What does POST /kickoff take?" | `/en/api-reference/kickoff.md` | JSON body with required `inputs` (string values) and optional `meta`, `taskWebhookUrl`, `stepWebhookUrl`, `crewWebhookUrl`; returns `{"kickoff_id": ...}`; bearer token auth. The installed `crewai_tools` `InvokeCrewAIAutomationTool` posts the same `{"inputs": ...}` body. call-deployed-crew covers the full client |
| "How do I set an embedder for knowledge?" | `/en/concepts/knowledge.md` | Pass `embedder={"provider": ..., "config": {...}}` on the `Crew` (or on an `Agent`). The default is OpenAI embeddings even with a non-OpenAI LLM; without `OPENAI_API_KEY` the knowledge upsert logs an error. A crew with an Anthropic LLM and `{"provider": "onnx", "config": {}}` answered from its knowledge source |

Other good uses:

| User question | Why this skill |
|---|---|
| "What parameters does `Crew()` accept?" | API reference - check it against the installed signature |
| "How do I turn off telemetry?" | `/en/telemetry.md` for what is collected; the test-crewai-project skill has the exact switch values, checked against the installed package |
| "What CLI commands does `crewai` support?" | `/en/concepts/cli.md`, then `crewai --help` on the installed version |
| "What tools are available for web scraping?" | Tools library pages under `/en/tools/` |
| "How do I set up RBAC on AMP?" | `docs-platform.crewai.com` (`/platform/en/features/rbac`) |
| "How do I build a chat app with `Flow.handle_turn()`?" | Experimental conversational Flow API; read the latest guide |

---

## Setting Up the Docs MCP Server (optional)

Path B works with no setup. For structured search, add the server to the coding agent.

**Claude Code** (`claude mcp add`):

```bash
claude mcp add --transport http crewai-docs https://docs.crewai.com/mcp
# --scope project writes .mcp.json in the repo instead; --scope user makes it global
claude mcp list   # shows "crewai-docs: https://docs.crewai.com/mcp (HTTP) - Connected"
```

The project-scope `.mcp.json` it writes:

```json
{
  "mcpServers": {
    "crewai-docs": {
      "type": "http",
      "url": "https://docs.crewai.com/mcp"
    }
  }
}
```

**Codex CLI** - `codex mcp add crewai-docs --url https://docs.crewai.com/mcp`, which writes this to `~/.codex/config.toml` (or `$CODEX_HOME/config.toml`):

```toml
[mcp_servers.crewai-docs]
url = "https://docs.crewai.com/mcp"
```

**Cursor** - add to `.cursor/mcp.json` in the project, or `~/.cursor/mcp.json` for all projects ([Cursor MCP docs](https://cursor.com/docs/mcp)):

```json
{
  "mcpServers": {
    "crewai-docs": { "url": "https://docs.crewai.com/mcp" }
  }
}
```

Other agents: add `https://docs.crewai.com/mcp` as a remote (streamable HTTP) MCP server. Add `https://docs-platform.crewai.com/mcp` the same way for AMP platform docs.

---

## Related Skills

- **getting-started** — project scaffolding, choosing abstractions, Flow architecture
- **design-agent** - agent Role-Goal-Backstory, parameter tuning, tools, memory and knowledge
- **design-task** — task descriptions, expected_output, guardrails, structured output, dependencies
- **check-crewai-api** - current 1.15.x API versus the 0.x API assistants remember
- **build-flow** - Flow state, decorators, routing, persistence
- **connect-tools-and-mcp** - custom tools, `crewai_tools`, MCP servers for agents
- **test-crewai-project** - deterministic pytest testing of crews and flows
- **deploy-to-amp** - getting a crew or flow onto CrewAI AMP
- **call-deployed-crew** - calling a deployed crew over HTTP

More from crewAIInc/skills

SkillDescription
build-flowBuilding CrewAI Flows on crewai 1.15.x: structured (Pydantic) vs dict state and state.id, @start/@listen/@router wiring, or_/and_ semantics, router labels vs method names, @persist (correct import, where it stores state, restore_from_state_id), checkpointing with CheckpointConfig, @human_feedback and HumanFeedbackResult.feedback, plot(), calling crews and agents from flow methods, kickoff inputs, and the `crewai create flow` scaffold. Use when writing or debugging a Flow subclass or main.py with `from crewai.flow import ...`, when a listener never fires or fires twice, or when you see errors like \"listen condition 'x' references the handler name 'x'\", \"cannot import name 'persist'\", \"'StateWithId' object is not subscriptable\", \"Flow state model must have an 'id' field\", \"--inputs requires a declarative flow definition\", \"invoked synchronously from within a running event loop\", or HumanFeedbackCollapseError.
call-deployed-crewCalling a crew or flow deployed on CrewAI AMP over HTTP: the bearer token and deployment URL, GET /inputs, POST /kickoff with the {\"inputs\": {...}} body, which input keys are required ({placeholder} tokens), polling GET /status/{kickoff_id} with a deadline and backoff, terminal states and where the result lives, webhooks, POST /resume, slow first calls, and writing crews that stay correct when they are kicked off repeatedly or concurrently. Use when writing a client, script, backend or frontend that calls a deployed crew, when a kickoff returns 422 \"Missing inputs: ...\", when a status poll never ends, says \"NOT FOUND\" or the result field is empty, when /resume returns 422 for executionId, when a run's prompt shows another run's data, or when the user pastes a kickoff_id, a /kickoff curl, or 'Template variable ... not found in inputs dictionary'.
check-crewai-apiCurrent crewai 1.15.x API versus the 0.x API that coding assistants remember: imports, Agent/Task/Crew parameters and defaults, kickoff variants, CrewOutput fields, LLM model strings and provider extras, structured output (output_pydantic, response_model, response_format), guardrails, unified Memory, knowledge embedders, the `crewai create crew` wizard vs --classic, reset-memories flags, and removed features. Use when writing, reviewing, or debugging any crewai code, before trusting remembered crewai syntax, or when a user pastes errors like `cannot import name 'BaseTool' from 'crewai_tools'`, `cannot import name 'persist'`, `ShortTermMemory`, `Anthropic native provider not available`, `LiteLLM fallback package is not installed`, `got an unexpected keyword argument 'response_format'`, `OPENAI_API_KEY is required`, `If return type is annotated, it must be Tuple[bool, Any]`, or `result.pydantic is None`.
connect-tools-and-mcpGiving crewAI agents tools and MCP servers on crewai 1.15.x: custom BaseTool with args_schema and @tool, which crewai_tools names really exist, tool caching, max_usage_count, ToolFailure, Agent(mcps=[...]) string and MCPServerStdio/HTTP/SSE forms, rewritten MCP tool names, MCPServerAdapter, timeouts, and what works on a hosted deployment. Use when writing or debugging a tool or MCP connection, when you see 'cannot import name BaseTool from crewai_tools', 'You are missing the mcp package', 'MCPConnectionError', 'Operation timed out after 30 seconds', 'reached its usage limit', 'Invalid MCP reference', 'Anthropic function name ... must start with a letter', an agent that never calls an MCP tool, mcps=[...] that yields no tools (for example an https:// string under akickoff or on CrewAI AMP), or a stdio MCP server that works locally but not after deploy.
deploy-to-ampGetting a CrewAI crew or flow onto CrewAI AMP: the project shape the build expects (uv.lock, [tool.crewai] type, src/<pkg>/ entry points, a real Flow subclass, absolute imports, a self-contained root), `crewai deploy validate`, the three deploy paths (CLI create/push, GitHub, ZIP upload) and what each one actually uploads, env vars per deployment and what the CLI re-sends from .env, provider keys and extras, and machine-wide org selection. Use when running `crewai deploy create` / `crewai deploy push` / `crewai deploy validate`, when a deploy says Online but runs old code, old env values or lost a key, or when pasting errors like `missing_lockfile`, `Crew class annotated with @CrewBase not found`, `No Flow subclass found`, `Expected to find at least one of these files: uv.lock or poetry.lock`, `OPENAI_API_KEY is required`, `Anthropic native provider not available`, `deployment_not_found`, `git_clone_failure`, `Automation error, fix the code and deploy again`, or `pyproject.toml not found`.
design-agentCrewAI agent design and configuration. Use when creating, configuring, or debugging crewAI agents — choosing role/goal/backstory, selecting LLMs, assigning tools, tuning max_iter/max_rpm/max_execution_time, enabling planning/delegation, setting up knowledge sources, using guardrails, or configuring agents in YAML vs code.
design-taskCrewAI task design and configuration. Use when creating, configuring, or debugging crewAI tasks — writing descriptions and expected_output, setting up task dependencies with context, configuring output formats (output_pydantic, output_json, output_file), using guardrails for validation, enabling human_input, async execution, markdown formatting, or debugging task execution issues.
test-crewai-projectDeterministic, offline testing of CrewAI crews and flows with pytest: a stub BaseLLM (shipped in references/stub_llm.py) that drives text, structured output and tool calls with no API key, asserting on the prompts crewai built, testing guardrails and flow routing, what `crewai test` really does, event listeners for debugging, and the exact tracing/telemetry env var values. Use when writing tests for a crewai project, mocking or stubbing the LLM, writing a custom BaseLLM, seeing `TypeError: ... call() got an unexpected keyword argument 'from_task'`, `ValueError: OPENAI_API_KEY is required` in CI, `TraceGrantError` in pytest, running `crewai test`, adding a BaseEventListener, or setting CREWAI_TRACING_ENABLED / CREWAI_DISABLE_TELEMETRY / OTEL_SDK_DISABLED.