Skip to main content
Glama

crewlog

Give every teammate's coding agent shared company context — and one append-only log of everything your crew (humans and agents) is doing.

crewlog is an MCP server for teams running agentic coding tools (Claude Code, OpenCode, Codex, or anything MCP-compatible). Each person's agent can see Linear tasks, Slack discussion, and a shared company activity log that merges Slack messages, Linear changes, call summaries (Granola webhooks), and coding sessions into one timeline. A daily coordinator — Claude on a cron — reads the log and writes a briefing that every agent surfaces before planning the day. Ask your agent "what should I do next?" or "what did I miss?" and it knows.

Modeled on Fleet AI's Code with Claude 2026 talk "Claude & the self-driving company": "Making company operations fully legible to Claude. Single append-only log of all unstructured activity (coding sessions, Slack, calls)" — and Claude guiding coordination on top of it.

Slack Events API ───┐ (signed webhooks)
Linear webhooks ────┤
Granola webhooks ───┼─► Convex HTTP actions ─► events table (append-only) ─┐
POST /ingest ───────┤                                 ▲                    │
agents (log_work) ──┤                     daily cron  │                    │
SessionEnd hook ────┘             Claude coordinator ─┘ (briefing → log,   │
                                                          optional Slack)  ▼
your team's agents ◄── crewlog MCP (stdio, per-user) ◄── whats_next / activity_log / search_log
                                    │
                                    └── live: Linear API (your key), Slack API (your token)

The live tools answer "what's next / who's doing what" from the source-of-truth APIs. The log answers "what happened across the company." Coding sessions land in it two ways: automatically via the Claude Code SessionEnd hook (scripts/log-session.ts), and explicitly via log_work (1-3 sentence summaries agents append mid-flight, from any MCP client). Calls land via Granola's webhooks. Anything else lands via the generic /ingest endpoint.

Open core

Everything in this repo is MIT. There are two ways to run the log backend, and the same code serves both:

  • Self-host — deploy your own Convex project (free tier covers a small team; Convex is open-source/self-hostable). Zero extra setup: one team per deployment, authenticated by the CREWLOG_KEY env var. See Self-hosting the backend.

  • Use a hosted backend, free of charge — point CREWLOG_CONVEX_URL at a shared multi-tenant deployment (e.g. the maintainer's — open an issue to get a team) and use the team key you're given. Your webhook URLs get a /t/<team>/ prefix; everything else is identical. Note the trust tradeoff: the operator of a hosted backend can read your team's log and the integration secrets you configure — self-host when that's not acceptable.

Anyone can operate a shared backend for others — see Operating a shared backend.

Related MCP server: Malon

Tools

Tool

Source

What it does

whats_next

Log + Linear

Latest coordinator briefing, then your in-progress issues, queue by priority, urgent unassigned work

team_status

Linear

Who is working on what right now, plus unassigned urgent/high

get_issue

Linear

Full issue detail by identifier (ENG-123) incl. comments

search_linear

Linear

Text search over issues

update_issue

Linear (write)

Change state / assignee / priority

comment_on_issue

Linear (write)

Add a markdown comment

create_issue

Linear (write)

Create an issue in a team

search_slack

Slack

Search messages with your visibility (in:#chan from:@user works)

slack_channel_history

Slack

Recent messages from one channel

activity_log

Log

Company-wide feed: Slack + Linear + calls + agent work, one timeline

search_log

Log

Full-text search over the log (incl. agent work summaries)

log_work

Log (write)

Append a 1-3 sentence work summary so other agents see it

Slack is read-only by design. The log is append-only: nothing updates or deletes.

Auth model

  • Per-user Linear API key — "my tasks" resolves to the individual, and writes are attributed to the person whose agent made them.

  • Per-user Slack user token (xoxp) — enables real Slack search and respects each person's channel visibility. One shared Slack app; each teammate authorizes once via pnpm run slack-auth.

  • Team-shared log credentials — a Convex deployment URL and a shared secret (the CREWLOG_KEY env var when self-hosting; a per-team key, stored hashed, on a hosted backend).

  • Server-side secrets (bot token, webhook secrets) live only in the Convex deployment — in its environment when self-hosting, in the team's row on a hosted backend — never in the repo or on laptops.

Two consequences worth knowing: all four client env vars are required even if you only use the log tools (the log resolves your name via Linear so entries are attributed consistently), and anyone holding the team key can append any event to the log — including briefing-kind events that whats_next surfaces — so treat the key like the shared secret it is. Nothing can ever modify or delete a logged event. Vulnerability reports: see SECURITY.md.

Self-hosting the backend (admin, ~20 minutes)

  1. Clone and install:

    git clone <your crewlog repo> && cd crewlog
    pnpm install
  2. Deploy the log backend (Convex; free tier covers a small team, and Convex is open-source/self-hostable):

    npx convex deploy

    In the Convex dashboard, set env vars on the deployment: SLACK_SIGNING_SECRET, SLACK_BOT_TOKEN (from step 3), LINEAR_WEBHOOK_SECRET (invent a strong random string), and CREWLOG_KEY (invent another). Note the deployment's two URLs: *.convex.cloud (client) and *.convex.site (HTTP actions).

  3. Slack app: create at api.slack.com/apps → "From a manifest" → paste slack-app-manifest.yaml with the request URL set to https://<deployment>.convex.site/slack/events. Install to workspace. Invite the bot to every channel that should be logged: /invite @crewlog. Bot membership is the logging opt-in.

  4. Linear webhook: Linear → Settings → API → Webhooks → new webhook with URL https://<deployment>.convex.site/linear/webhook, secret = LINEAR_WEBHOOK_SECRET, event types: Issues + Comments.

  5. Calls via Granola (optional; needs a Granola Business/Enterprise plan for API access): in the Granola desktop app, Settings → Connectors → API keys → create a key (grn_...). Register a webhook for new meeting notes:

    curl -X POST https://api.granola.ai/v1/webhook-endpoints \
      -H "Authorization: Bearer grn_YOUR_KEY" -H "Content-Type: application/json" \
      -d '{"url": "https://<deployment>.convex.site/granola/webhook",
           "scopes": ["public"], "events": ["note.generated"]}'

    The response contains a signing_secret (whsec_...), shown only once. Set GRANOLA_WEBHOOK_SECRET (that secret) and GRANOLA_API_KEY (the grn_ key) on the Convex deployment. Each new meeting summary now lands in the log as a call event. Other transcription tools can post to /ingest instead (below).

  6. Daily coordinator (optional): set ANTHROPIC_API_KEY on the Convex deployment. Every day at 13:00 UTC (edit convex/crons.ts to change), Claude reads the last 24h of the log and appends a briefing that every teammate's whats_next then surfaces first. Optional extras: CREWLOG_BRIEFING_CHANNEL (a Slack channel id or #name the bot is in — posts the briefing there; needs the manifest's chat:write scope) and CREWLOG_COORDINATOR_MODEL (defaults to claude-opus-5; the request ships with a server-side fallback to claude-opus-4-8 in case the primary model declines — set the env var to a current model when these are eventually deprecated). To run without the coordinator, don't set ANTHROPIC_API_KEY and delete the registration in convex/crons.ts.

  7. Distribute via your secret manager: CREWLOG_CONVEX_URL (the *.convex.cloud URL), CREWLOG_KEY, and the Slack app's Client ID + Secret.

Operating a shared backend (multi-tenant)

One deployment can host the log for many teams free of charge — this is how the hosted option works. Teams are rows in the teams table, created and configured by the operator with npx convex run (never over HTTP):

# Create a team: mints /t/acme/* webhook routes; the key is what the team's
# MCP clients authenticate with (only its sha256 hash is stored).
npx convex run teams:create '{"slug":"acme","name":"Acme","key":"'"$(openssl rand -hex 32)"'"}'

# Set the team's integration secrets (the team creates its own Slack app /
# Linear webhook / Granola key, using /t/acme/-prefixed request URLs, and
# hands the secrets to the operator):
npx convex run teams:configure '{"slug":"acme","slackSigningSecret":"...","slackBotToken":"xoxb-..."}'
npx convex run teams:configure '{"slug":"acme","linearWebhookSecret":"..."}'
npx convex run teams:configure '{"slug":"acme","granolaApiKey":"grn_...","granolaWebhookSecret":"whsec_..."}'

# Opt the team into the daily coordinator briefing (uses the deployment's
# ANTHROPIC_API_KEY) and optionally post it to their Slack:
npx convex run teams:configure '{"slug":"acme","coordinatorEnabled":true,"briefingChannel":"#standup"}'

# Rotate a team's key:
npx convex run teams:configure '{"slug":"acme","key":"'"$(openssl rand -hex 32)"'"}'

The team then uses CREWLOG_CONVEX_URL = the shared deployment's *.convex.cloud URL and CREWLOG_KEY = their team key. Webhook URLs are the self-host ones with a /t/<slug> prefix, e.g. https://<deployment>.convex.site/t/acme/slack/events. Events are scoped per team everywhere (indexes and search included). Webhook ingestion is idempotent — Slack and Granola deliveries dedupe on their event ids, Linear on a hash of the delivery body — so retries never double-log. One operator caveat: the log is append-only and never pruned, so storage grows with tenant activity; a retention lever is deliberately out of scope for now.

Anything else → POST /ingest

Any other activity source (Zapier zaps, other call-transcription tools, cron scripts) can append to the log directly:

curl -X POST https://<deployment>.convex.site/ingest \
  -H "Authorization: Bearer $CREWLOG_KEY" -H "Content-Type: application/json" \
  -d '{"source": "call", "actor": "Fireflies", "kind": "meeting",
       "ref": "Weekly sync", "text": "Discussed the Q3 roadmap...", "url": "https://..."}'

source must be one of slack | linear | agent | call; ts (epoch ms) is optional and defaults to now. Pass an optional external_id (any stable string) to make retries idempotent — a second request with the same external_id is a no-op.

Per-teammate setup (~5 minutes)

  1. Clone crewlog (by convention, next to the repos you work in) and install:

    git clone <your crewlog repo> && pnpm install --dir crewlog
  2. Linear key: linear.app → Settings → Security & access → API keys.

  3. Slack token:

    SLACK_CLIENT_ID=... SLACK_CLIENT_SECRET=... pnpm --dir crewlog run slack-auth
  4. Export all four vars in ~/.zshrc (MCP clients expand ${VAR} from the shell — they do not read .env files):

    export LINEAR_API_KEY=lin_api_...
    export SLACK_USER_TOKEN=xoxp-...
    export CREWLOG_CONVEX_URL=https://<deployment>.convex.cloud
    export CREWLOG_KEY=...
  5. Register the server in your client (below), restart it, and ask: "what should I do next?"

  6. Automatic session logging (Claude Code): add a SessionEnd hook to the project repos you work in (commit .claude/settings.json once and the whole team gets it). When a session ends, scripts/log-session.ts digests the transcript — first ask, follow-up/tool-call counts, outcome — and appends it to the log so every teammate's agent sees what was worked on:

    {
      "hooks": {
        "SessionEnd": [
          {
            "hooks": [
              {
                "type": "command",
                "command": "pnpm --dir ../crewlog exec tsx scripts/log-session.ts"
              }
            ]
          }
        ]
      }
    }

    Adjust ../crewlog to where crewlog is cloned relative to the project. The hook inherits your shell env, so the same four exported vars cover it.

Client configuration

All examples assume crewlog is cloned at ../crewlog relative to your project root — adjust the path to your layout. Commit these to your project repo once and the whole team gets them.

Claude Code.mcp.json at your project root:

{
  "mcpServers": {
    "crewlog": {
      "command": "pnpm",
      "args": ["--dir", "../crewlog", "exec", "tsx", "src/index.ts"],
      "env": {
        "LINEAR_API_KEY": "${LINEAR_API_KEY:-}",
        "SLACK_USER_TOKEN": "${SLACK_USER_TOKEN:-}",
        "CREWLOG_CONVEX_URL": "${CREWLOG_CONVEX_URL:-}",
        "CREWLOG_KEY": "${CREWLOG_KEY:-}"
      }
    }
  }
}

OpenCodeopencode.json at your project root (local servers inherit your shell env):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "crewlog": {
      "type": "local",
      "command": ["pnpm", "--dir", "../crewlog", "exec", "tsx", "src/index.ts"],
      "enabled": true
    }
  }
}

Codex~/.codex/config.toml (Codex's config is global by default; trusted projects may also use a project-scoped .codex/config.toml). Codex does not expand ${VAR} in this file, so either rely on it inheriting your shell env, or set the values explicitly in the server's env table:

[mcp_servers.crewlog]
command = "pnpm"
args = ["--dir", "/path/to/crewlog", "exec", "tsx", "src/index.ts"]

[mcp_servers.crewlog.env]
LINEAR_API_KEY = "lin_api_..."
SLACK_USER_TOKEN = "xoxp-..."
CREWLOG_CONVEX_URL = "https://<deployment>.convex.cloud"
CREWLOG_KEY = "..."

Development

pnpm run typecheck        # tsc over src/scripts/tests and convex/
pnpm test                 # vitest: format helpers, webhook mappers, crypto vectors
pnpm run inspect          # MCP inspector UI
pnpm exec convex dev      # local Convex backend (anonymous, no login needed)

Webhook payload → log event mapping is pure (convex/mappers.ts) and covered by fixture tests; signature verification lives in convex/lib.ts with known-answer vectors. CI runs typecheck + tests on every PR and push to main.

This repo's own .mcp.json points at itself, so opening it in Claude Code dogfoods the server. convex/_generated/ is committed so the package typechecks without a Convex login; convex dev/codegen refreshes it after schema changes.

License

MIT

Available Tools

12 tools
activity_logA

The company-wide activity feed: Slack messages, Linear changes, call summaries, and teammates' agent work logs merged into one timeline. Call this when the user asks "what happened", "what did I miss", "what has the team been doing", or to catch up after time away. When both source and actor are set, fewer than limit rows may come back.

ParametersJSON Schema
NameRequiredDescriptionDefault
actorNoFilter to one person's activity
limitNo
sinceNoLower bound like "90m", "24h", "7d", or ISO date
sourceNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses the company-wide scope and the multi-source merging behavior. Mentions the row count behavior with combined filters. However, it does not explicitly state that the tool is read-only, nor does it address pagination, ordering, or rate limits. Since no annotations are provided, the description carries full burden, and these omissions leave some behavioral aspects unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver the core purpose, usage guidance, and a behavioral nuance. Every sentence is informative and front-loaded with the tool's function. No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the tool's purpose and usage well but lacks details about the output format. Since there is no output schema, the agent might need to infer the structure of timeline entries. For a feed tool, mentioning that each entry includes timestamp, actor, and source would increase completeness. However, the description is sufficient for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning beyond the schema by explaining the source enum values concretely (e.g., 'Slack messages' maps to slack) and clarifying the interaction between source and actor filters. Since schema description coverage is 50%, the description compensates by illustrating how parameters combine. It does not detail the 'since' or 'limit' parameters beyond what the schema provides, but the overall semantic contribution is significant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as a company-wide activity feed merging Slack, Linear, call summaries, and agent work logs. It provides specific example queries ('what happened', 'what did I miss'), distinguishing it from sibling tools like search_slack or search_linear which focus on single sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call the tool: when users ask about overall activity or catching up. Provides a behavioral note about row counts when both source and actor are set. Does not explicitly mention when not to use it or alternative tools, but the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

comment_on_issueA

Add a markdown comment to a Linear issue. Call this to record findings, decisions, or progress on an issue so the team sees it.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesComment body, markdown supported
identifierYesIssue identifier like REF-123

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose behavioral traits. It confirms the tool adds a comment and supports markdown, but does not mention side effects (e.g., notifications), permissions, or idempotency. The behavior is minimally clear but leaves gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. The first sentence states the core function; the second provides usage context. Front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (2 required params, no output schema), so the description is adequate but not thorough. Missing details like whether comments are appended, notification behavior, or character limits. Completeness is acceptable but could be better.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no new meaning beyond repeating 'markdown supported' and 'issue identifier like REF-123', which are already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Add a markdown comment') and the resource ('Linear issue'). It distinguishes from siblings like update_issue and get_issue by specifying that it records comments rather than modifying issue fields or reading data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use the tool ('record findings, decisions, or progress'), but does not explicitly state when not to use it or mention alternatives like update_issue for editing issue description. Usage context is implied but exclusions are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_issueA

Create a new Linear issue. Call this when work is discovered that isn't tracked yet — a bug found while coding, a follow-up task, or something the user asks to capture.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
assigneeNoTeammate name or email
priorityNo0=None 1=Urgent 2=High 3=Medium 4=Low
team_keyYesLinear team key, e.g. REF
descriptionNoMarkdown body

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must fully disclose behavioral traits. It only states 'Create' (mutation) without detailing side effects, permissions, or error handling. Basic purpose is clear, but critical behavioral context is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The first sentence states the core purpose, and the second provides usage guidance. Highly concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose and usage but does not explain return values (no output schema) or handle missing annotations. With 5 parameters and no output schema, some context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80% (4 of 5 parameters have descriptions). The tool description adds no additional parameter semantics beyond the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new Linear issue' with specific usage scenarios (bug, follow-up, capture request), differentiating it from siblings like get_issue, update_issue, and search_linear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to call this tool ('when work is discovered that isn't tracked yet') with concrete examples, though it does not explicitly list when not to use it. The sibling tools provide alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_issueA

Full detail for one Linear issue by identifier (e.g. REF-123): description, state, assignee, priority, and all comments. Call this before starting work on an issue or when the user references an issue id.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesIssue identifier like REF-123

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It explains what data is returned but does not state read-only nature or absence of side effects. The verb 'get' implies idempotency, but explicit statement would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states action and output details, second gives usage guidance. No unnecessary words; well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple one-parameter tool with no output schema. Description lists return fields and usage context. Missing details like pagination or error handling, but adequate for a straightforward retrieval.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (identifier) with schema description 'Issue identifier like REF-123'. The description repeats the example, adding minimal value beyond schema. Baseline 3 as schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states it retrieves full detail for one Linear issue by identifier, listing specific fields (description, state, assignee, priority, comments). This clearly distinguishes it from siblings like search_linear (searching) and update_issue (modifying).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises when to call: before starting work on an issue or when the user references an issue ID. Does not mention when not to use or compare to siblings, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_workA

Append a short work summary to the shared company activity log so every teammate's agent can see it. Call this after completing significant work, making a decision, or starting a task others should know about. Keep it to 1-3 sentences.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoWhat it relates to: issue id (REF-123), repo area, or project
textYesWhat was done / decided / started

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Clearly states it appends to a shared log. Does not mention permission requirements or reversibility, but for a simple write operation this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences total, with purpose front-loaded. Every sentence adds value: purpose, usage triggers, content length guideline. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity, no output schema, and full schema description coverage, the description is complete. It explains the tool's role, when to call, and how to format input.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and description adds valuable context beyond schema: 'ref' explained as issue id, repo area, or project; 'text' as what was done. This helps agents format correct inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('append', 'summarize') and identifies the resource ('shared company activity log'). It distinguishes from sibling tools like 'activity_log' (likely read-only) and 'comment_on_issue' (issue-specific).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call the tool: after completing significant work, making a decision, or starting a task. Also provides content constraints ('1-3 sentences'). Does not explicitly mention when not to use, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_linearA

Search Linear issues by text. Call this to find issues about a topic, feature, or bug when you don't have an identifier.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. However, it only states 'search by text' without disclosing any behavioral traits like result scope, sorting, or limitations. Missing critical context for safe usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no unnecessary words. Front-loaded with purpose. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (2 params, no output schema), the description should at least specify return format, pagination, or scope. It omits these, leaving the agent underinformed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, requiring the description to explain parameters. It only mentions 'by text' for query and says nothing about limit, its behavior, or formatting. Fails to add meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (search Linear issues by text) and specifies when to use it (when you don't have an identifier), distinguishing it from siblings like get_issue.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use when looking for issues by topic, feature, or bug without an identifier. Implies not to use when you have an identifier, but doesn't explicitly list when-not or alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_logA

Full-text search over the company activity log — the one place that also contains teammates' agent work summaries. Call this to find who touched a topic, past decisions, or work that never made it into an issue.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description implies read-only behavior (search) but does not explicitly confirm or mention any side effects, permissions, or data scope beyond the activity log.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. First sentence states the core purpose; second adds valuable usage context. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema or parameter descriptions, the only missing context is parameter semantics and what results look like. The description provides good usage guidance but leaves key details unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no explanation of the 'query' or 'limit' parameters. The agent gains no additional insight beyond the raw schema properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Full-text search over the company activity log' and notes it includes teammate agent work summaries, distinguishing it from sibling search tools like search_linear and search_slack.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit scenarios: 'find who touched a topic, past decisions, or work that never made it into an issue.' Implies when to use but does not explicitly state when not to use or mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_slackA

Search Slack messages with your visibility. Supports Slack query syntax: "in:#channel", "from:@name", quoted phrases. Call this to find past discussion, decisions, or context about a topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full burden. It mentions 'with your visibility' hinting at permission-based results and describes supported query syntax behavior. It does not disclose potential rate limits or pagination details, but the transparency about query capabilities is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the primary action, and each sentence adds meaningful information without redundancy. It is highly efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters (one required), no output schema, and no annotations, the description provides adequate context for usage. It covers the query syntax and purpose but lacks information about the return format or behavior for empty results. However, it is reasonably complete for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must add meaning. It explains the 'query' parameter through examples of Slack syntax (e.g., 'in:#channel', 'from:@name'), adding value beyond the schema. However, it does not explain the 'limit' parameter or its constraints, leaving part of the parameter semantics unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches Slack messages with a specific verb 'Search', identifies the resource 'Slack messages', and provides context about using Slack query syntax. It distinguishes itself by mentioning 'with your visibility' and gives use cases like finding past discussion, decisions, or context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this to find past discussion, decisions, or context about a topic,' providing clear usage context. However, it does not differentiate from the sibling tool 'slack_channel_history' or specify when not to use this tool, but the guidance is still strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_channel_historyA

Recent messages from one Slack channel, oldest first. Call this to catch up on a channel (e.g. #eng, #standup) or check the latest discussion before starting work.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
channelYesChannel name, "#" optional

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must fully convey behavioral traits. Only states 'oldest first' and 'recent messages'. Lacks details on read-only nature, whether threads are included, rate limits, or required permissions. Important for an agent to know if the operation is safe and what it returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with key action and use cases. No fluff or redundant information. Examples are helpful and immediately convey context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with 2 parameters and no output schema. Description covers main purpose but omits output format, pagination behavior, and whether metadata (e.g., timestamps) is included. Could be more complete for a tool used to 'catch up' by detailing what the result looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 'channel' with a description, but 'limit' lacks explanation. Description adds no parameter details beyond schema. With 50% schema coverage, baseline is 3; description does not compensate by explaining parameter behavior (e.g., what 'limit' controls).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches recent messages from one Slack channel, sorted oldest first. Provides concrete use cases (catching up on #eng, #standup, checking latest discussion). Distinguishes from 'search_slack' sibling by focusing on history retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly suggests when to call: to catch up or check latest discussion. Does not explicitly exclude cases (e.g., searching for specific terms), but context clearly differentiates from search siblings. Could mention alternative tools like 'search_slack' for search scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

team_statusA

Who on the team is working on what right now, from Linear. Call this when the user asks what the team is doing, whether someone is already on a task, or before picking up work that might overlap with a teammate.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_keyNoLinear team key (e.g. REF) to scope to one team

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavioral traits. It implies a read operation by stating 'who on the team is working on what right now,' but does not detail data freshness, permissions, scoping behavior without a team_key, or any side effects. The description is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two clear sentences: the first defines the purpose and the second gives usage guidance. No unnecessary words or repetition, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter, no output schema, and no annotations, the description provides adequate context for what it does and when to use it. However, it does not explain the return format or the behavior when no team_key is provided, which could leave an agent uncertain about the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter 'team_key' with a schema description. The main description adds no additional meaning about the parameter beyond what the schema already provides, so it meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns current work assignments from Linear ('Who on the team is working on what right now, from Linear'). It distinguishes itself from sibling tools like get_issue (which retrieves a single issue) and search_linear (which is a general search) by focusing on real-time team status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to call the tool ('when the user asks what the team is doing, whether someone is already on a task, or before picking up work that might overlap with a teammate'). However, it does not explicitly mention when not to use it or name alternatives, though the context of sibling tools helps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_issueA

Update a Linear issue's state, assignee, and/or priority. Call this when the user starts work (state → In Progress), finishes (state → Done/In Review), or asks to reassign or reprioritize. State is matched by name against the issue's team workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoWorkflow state name, e.g. "In Progress"
assigneeNoTeammate name or email
priorityNo0=None 1=Urgent 2=High 3=Medium 4=Low
identifierYesIssue identifier like REF-123

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full responsibility for behavioral disclosure. It states the tool updates three fields and that state is matched by name, but does not disclose side effects (e.g., notifications, permissions required), whether updates are partial or full replacement, or what happens to unspecified fields. This is minimal for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with purpose, followed by usage guidance. Every sentence adds value with no repetition or filler. Structure is clear and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters (1 required) and no output schema, the description covers the main purpose and usage scenarios. It explains state matching behavior and typical use cases. It is mostly complete, though it could briefly note that the update is immediate or mention any required permissions for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter has a description. The tool description adds only one extra detail: 'State is matched by name against the issue's team workflow,' which provides context beyond the schema's 'Workflow state name, e.g. In Progress'. For other parameters, the description does not add significant meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates a Linear issue's state, assignee, and/or priority, using specific verbs like 'starts work' and 'finishes'. It distinguishes from sibling tools like get_issue (read-only), create_issue (creation), and comment_on_issue (comments).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage scenarios: when a user starts work (state to 'In Progress'), finishes (state to 'Done/In Review'), or reassigns/reprioritizes. It explains state matching by workflow name. However, it does not mention when NOT to use the tool or explicitly list alternatives beyond the context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whats_nextA

What the current user should work on next. Call this when the user asks what to do, what's next, what their priorities are, or at the start of a work session. Shows the coordinator's daily briefing (company-wide priorities), then their in-progress issues, their queue by priority, and urgent unassigned work from Linear.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently lists the four components of the response (briefing, in-progress issues, queue, urgent work), making the tool's behavior predictable. No side effects or contradictions are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph of three sentences, efficiently conveying all necessary information. It is front-loaded with the action verb and context. Could be slightly improved with structured formatting, but remains concise and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of parameters and output schema, the description is remarkably complete. It explains the tool's aggregation of multiple data sources (briefing, issues, queue, urgent work) and its expected use case, leaving no critical gaps for the agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so baseline 4 applies. The description correctly implies that no input is needed, as the output is automatically scoped to the current user. No additional parameter documentation is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's purpose: showing what the current user should work on next, including a daily briefing, in-progress issues, prioritized queue, and urgent unassigned work. It distinguishes from siblings like get_issue (single issue) and team_status (team view).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to call the tool: when the user asks what to do, what's next, about priorities, or at the start of a work session. It does not explicitly mention when not to use it, but the positive conditions are clear and helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 12 tool updatesv0.1.0
    • First observedactivity_log
    • First observedcomment_on_issue
    • First observedcreate_issue
    • First observedget_issue
    • First observedlog_work
    • First observedsearch_linear
    • First observedsearch_log
    • First observedsearch_slack
    • First observedslack_channel_history
    • First observedteam_status
    • First observedupdate_issue
    • First observedwhats_next

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct purpose: Linear issue operations, Slack queries, activity log actions, and coordination tools. No two tools overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., get_issue, search_slack, log_work). Minor abbreviation in 'whats_next' is acceptable.

Tool Count5/5

12 tools is well within the ideal range and covers all necessary actions for team coordination without being excessive.

Completeness4/5

The tool set covers core workflows: issue lifecycle, Slack context, activity logging, and status queries. Minor omissions like issue deletion or Slack messaging are acceptable given the domain scope.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A local-first MCP server for AI coding agents that shares structured execution state, routes context deltas, and provides preflight nudges to prevent conflicts and stale decisions.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A local-first MCP server that manages developer memory for coding agents, enabling shared project context, permissions, and audit trails across different agents.
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/quantbagel/crewlog'

If you have feedback or need assistance with the MCP directory API, please join our Discord server