TaskFlow
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TaskFlowshow me all overdue tasks across my projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TaskFlow — a Laravel app that AI agents can actually use
TaskFlow is a small project and task tracker built on the Laravel 13 Vue starter
kit — and the same domain is exposed to AI agents over the
Model Context Protocol with the official
laravel/mcp package.
A real Laravel app. Projects, tasks and labels with Eloquent relationships, policies, form requests, an Inertia + Vue 3 UI and 95 tests.
The same domain, two front doors. Everything the browser can do, an agent can do: 10 tools, 3 resources (including a URI template) and 2 prompts.
Real OAuth 2.1. Remote clients register themselves, the user approves a consent screen, and the token is never copied by hand — Passport fronts the HTTP endpoint, with personal access tokens for scripts.
Authorization written once. Relationship-scoped queries plus the same policies guard both doors, so an agent is simply another authenticated client.
Screenshots
Dashboard | Project detail |
|
|
Projects | Tasks |
|
|


Related MCP server: Headquarter
The MCP server
app/Mcp/Servers/TaskFlowServer.php is registered twice in routes/ai.php:
over stdio for editor agents, and over HTTP for remote clients.
Mcp::local('taskflow', TaskFlowServer::class);
Mcp::web('/mcp/taskflow', TaskFlowServer::class)
->middleware(['auth:sanctum', 'throttle:mcp'])
->name('mcp.taskflow');Tools
Tool | Annotations | What it does |
| read-only | Projects with task counts and progress |
| — | Creates a project for the authenticated user |
| idempotent | Renames, re-statuses or re-schedules a project |
| destructive | Deletes a project and its tasks |
| read-only | Filter by project, status, priority, overdue, due window, text |
| — | Adds a task, creating any new labels on the fly |
| idempotent | Title, description, status, priority, due date |
| idempotent | Ticks a task off or reopens it |
| destructive | Deletes a task |
| read-only | Streams |
Resources and prompts
taskflow://workspace/overview— the dashboard counters as JSON, from the sameWorkspaceStatsclass the dashboard uses.taskflow://projects/{projectId}/summary— a URI template that renders one project as markdown.taskflow://docs/conventions— what each status and priority means, and which tool to reach for. The only publicly cacheable primitive, because it is the only one that contains no user data.weekly-reviewandplan-projectprompts, which drive multi-tool workflows.
Run it locally
composer setup # installs, generates the app and Passport keys, migrates, seeds, builds
npm run devcomposer setup creates storage/oauth-*.key for Passport (gitignored, as they
should be) and the seeder creates the personal access client that the tokens
page issues from.
Sign in with demo@taskflow.test / password. The seeder also creates a
second user (ada@taskflow.test) whose work must never be visible to the demo
user — that is what the scoping tests assert.
Connect an MCP client
Over OAuth 2.1 — nothing to copy (recommended)
Point the client at the server and let it do the rest: it reads
/.well-known/oauth-protected-resource, registers itself through dynamic client
registration, sends you to a consent screen, and exchanges the code with PKCE.
claude mcp add --transport http taskflow https://laravel-mcp.test/mcp/taskflowApprove the screen in the browser and the client is connected. The grant is listed on the MCP tokens page and can be revoked there.
Over a personal access token — for scripts and CI
php artisan mcp:token demo@taskflow.test --name="CI" --scopes=mcp:readOr issue one from the MCP tokens page, which also fills in three copy-ready snippets with it. Send it as a bearer token:
{
"mcpServers": {
"taskflow": {
"type": "http",
"url": "https://laravel-mcp.test/mcp/taskflow",
"headers": { "Authorization": "Bearer ${TASKFLOW_MCP_TOKEN}" }
}
}
}Local TLS gotcha. Herd's certificate is trusted by macOS (so
curlworks) but not by Node's bundled CA list, so a client may fail withUNABLE_TO_VERIFY_LEAF_SIGNATURE. Either point Node at Herd's CA:export NODE_EXTRA_CA_CERTS="$HOME/Library/Application Support/Herd/config/valet/CA/LaravelValetCASelfSigned.pem"or skip TLS entirely with
php artisan serveand usehttp://127.0.0.1:8000/mcp/taskflow.
Over stdio (Claude Code, Cursor, …)
On the machine that runs the app, skip URLs, tokens and certificates entirely:
claude mcp add taskflow -- php /absolute/path/to/laravel-mcp/artisan mcp:serve --user=demo@taskflow.testmcp:serve picks the user the server acts as, then starts the stdio transport.
cp .mcp.json.example .mcp.json has the same thing in file form.
Inspect it
php artisan mcp:inspector taskflow # the stdio server
php artisan mcp:inspector mcp/taskflow # the HTTP server (keyed by route URI)How authorization works
Three layers, in this order:
Relationship-scoped lookups. Tools resolve ids through
$user->projects()and$user->tasks(), so another user's row comes back asnulland is reported as not found — never as forbidden. The tools cannot be used to probe for rows that are not yours.Scoped validation.
create-taskvalidatesproject_idwithRule::exists('projects', 'id')->where('user_id', $user->id), with an error message that tells the model to calllist-projectsfirst.The same policies as the web UI. Every mutating tool runs
Gate::forUser($user)->authorize(...)againstProjectPolicy/TaskPolicy.
On the HTTP transport, Passport decides who the caller is and what it may do.
The OAuth flow grants the mcp:use scope, which is full access; a personal
access token can be narrowed to mcp:read, and every write tool refuses it with
"This MCP token is read-only." throttle:mcp rate-limits per user.
The stdio transport is honest about what it is: mcp:serve --user= is an
identity selector for local development, not a security boundary — anyone who can
run artisan already has database access. It refuses to run in production.
Architecture
app/Mcp/
├── Servers/TaskFlowServer.php # name, version, agent instructions, registry
├── Tools/ # 10 tools
├── Resources/ # workspace overview, project summary template, conventions
├── Prompts/ # weekly-review, plan-project
├── Concerns/InteractsWithTaskFlowUser.php # user resolution + scoping + token abilities
└── Support/LocalUserResolver.php # stdio identity, refused in production
app/Support/
├── WorkspaceStats.php # one source for the dashboard and the MCP overview
└── TaskFlowPayload.php # one shape for Inertia props and structured content
app/Http/Controllers/Mcp/TokenController.php # the MCP tokens module (issue, list, revoke)
resources/js/pages/mcp-tokens/Index.vue
routes/ai.php # Mcp::oauthRoutes() + the two transportsDeliberate omissions, with reasons:
No
ToolSearchcatalog. Ten tools fit comfortably in any client's tool list; a searchable catalog starts paying off past roughly thirty.No published
config/mcp.php. This server uses no OAuth, no outgoing clients and no tool-search limits, so publishing it would only add dead config.No
#[Cacheable]on user-scoped primitives. Only the static conventions resource is publicly cacheable.
Tests
php artisan test # 95 tests
php artisan test --filter=Mcp # the MCP layer only
composer ci:check # lint, types, phpstan level 7, tests — what CI runsThe tests that carry the most weight are the scoping ones: list-projects does
not see another user's project, id-taking tools report it as missing, labels are
never shared between users, and POST /mcp/taskflow is unauthorized without a
token.
What I would do next
Queue the progress report once a workspace is large enough for it to be slow.
License
MIT.
This server cannot be deployed
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Project management MCP for AI agents with safe task reads and writes.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Minimal issue tracker: projects, objectives and trackable plans, written by agents over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceA local Model Context Protocol server providing backend tools for AI agents to manage projects and tasks with persistent storage in SQLite, enabling structured tracking of project tasks with dependencies, priorities, and statuses.124 npm25GPL 3.0
- AlicenseAqualityCmaintenanceAn AI-first business and project management tool that stores data locally in Markdown and JSON files, exposed via the Model Context Protocol (MCP). Enables project, issue, client, contact, and note management through natural language.25MIT
- AlicenseNot gradedqualityBmaintenanceA minimal task management system for LLM agent collaboration via the Model Context Protocol, supporting CRUD operations, task blocking, subtasks, queues, and comments.53 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to introspect a Laravel application's routes, models, controllers, migrations, and more through the Model Context Protocol, running locally via php artisan commands and filesystem scanning.5 npmMIT



