Skip to main content
Glama
Quire MCP Server

Quire MCP Server

Quire MCP Server

CI Coverage Status CodeQL OpenSSF Scorecard OpenSSF Best Practices npm version npm downloads License Node

A Model Context Protocol (MCP) server for the Quire project management platform.

This server allows AI assistants (like Claude) to interact with your Quire projects, tasks, and data securely.

Quick Start

Prerequisites

Step 1: Create a Quire OAuth App

  1. Go to Quire App Management

  2. Click Create new app

  3. Set Redirect URL to: http://localhost:3000/callback

  4. Choose the permission scopes you need

  5. Copy the Development Client ID and Development Client Secret

Step 2: Configure Your MCP Client

Choose the setup that matches your MCP client:

Add to your claude_desktop_config.json:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "quire": {
      "command": "npx",
      "args": ["-y", "quire-mcp"],
      "env": {
        "QUIRE_OAUTH_CLIENT_ID": "your-client-id",
        "QUIRE_OAUTH_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Claude Code (CLI)

Add to your Claude Code MCP settings (~/.claude/mcp.json or project-level):

{
  "mcpServers": {
    "quire": {
      "command": "npx",
      "args": ["-y", "quire-mcp"],
      "env": {
        "QUIRE_OAUTH_CLIENT_ID": "your-client-id",
        "QUIRE_OAUTH_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Cursor

In Cursor settings, add an MCP server:

{
  "mcpServers": {
    "quire": {
      "command": "npx",
      "args": ["-y", "quire-mcp"],
      "env": {
        "QUIRE_OAUTH_CLIENT_ID": "your-client-id",
        "QUIRE_OAUTH_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Step 3: First-Time Authorization

On first use, the server will:

  1. Print an authorization URL to the console

  2. Wait for you to open that URL in your browser

  3. After you grant access, Quire redirects to localhost

  4. The server captures the tokens and caches them

Subsequent uses will automatically refresh tokens as needed.

Related MCP server: MCP Feishu Project Manager

Transport Modes

The server supports two transport modes: stdio (default) and http.

STDIO Mode (Default)

STDIO mode is the simplest setup. The MCP client spawns the server process directly and communicates via JSON-RPC over stdin/stdout.

How it works:

  1. MCP client spawns npx quire-mcp with environment variables

  2. On first tool call, if no cached token exists, the server prints an OAuth URL to stderr

  3. User opens URL in browser and authorizes

  4. Quire redirects to localhost:3000/callback where the server captures the token

  5. Token is cached to disk for future use

Token cache locations:

  • Windows: %APPDATA%\quire-mcp\tokens.json

  • macOS: ~/Library/Application Support/quire-mcp/tokens.json

  • Linux: ~/.config/quire-mcp/tokens.json

HTTP Mode

HTTP mode runs an HTTP server with OAuth 2.0 endpoints. Use this when you need:

  • A long-running server process

  • Multiple clients connecting to the same server

  • Deployment to a remote host (e.g., Cloudflare Workers, cloud VMs)

Important: In HTTP mode, the server must be running before clients can connect. Environment variables are set on the server process, not in client configs.

Running HTTP Mode Locally

Step 1: Start the server:

# Using npx
QUIRE_OAUTH_CLIENT_ID=your-client-id \
QUIRE_OAUTH_CLIENT_SECRET=your-client-secret \
MCP_TRANSPORT=http \
npx quire-mcp

# Or using pnpm (for development)
pnpm dev:http

The server will output:

[quire-mcp] HTTP server listening on 127.0.0.1:3001
[quire-mcp] OAuth metadata: http://localhost:3001/.well-known/oauth-authorization-server
[quire-mcp] MCP endpoint: http://localhost:3001/mcp

Step 2: Configure your MCP client to connect:

{
  "mcpServers": {
    "quire": {
      "type": "http",
      "url": "http://localhost:3001/mcp"
    }
  }
}

Note: No env section is needed in the client config for HTTP mode—the OAuth credentials are on the server.

Step 3: When the MCP client connects, it will:

  1. Discover OAuth endpoints via /.well-known/oauth-authorization-server

  2. Redirect you to authorize with Quire

  3. Exchange tokens and establish a session

HTTP Mode Environment Variables

Variable

Required

Default

Description

MCP_TRANSPORT

Yes

stdio

Set to http to enable HTTP mode

QUIRE_OAUTH_CLIENT_ID

Yes

-

Quire OAuth Client ID

QUIRE_OAUTH_CLIENT_SECRET

Yes

-

Quire OAuth Client Secret

MCP_SERVER_HOST

No

127.0.0.1

Host to bind the HTTP server

MCP_SERVER_PORT

No

3001

Port for the HTTP server

MCP_ISSUER_URL

No

http://localhost:3001

Base URL for OAuth endpoints

QUIRE_OAUTH_REDIRECT_URI

No

http://localhost:3001/oauth/callback

Quire OAuth callback URL

Quire App Configuration for HTTP Mode: When using HTTP mode, update your Quire app's redirect URL to: http://localhost:3001/oauth/callback

Manual Token Mode

If you have a pre-obtained access token (e.g., from Postman), you can skip OAuth entirely:

{
  "mcpServers": {
    "quire": {
      "command": "npx",
      "args": ["-y", "quire-mcp"],
      "env": {
        "QUIRE_ACCESS_TOKEN": "your-access-token"
      }
    }
  }
}

Note: Manually-obtained tokens will eventually expire and won't auto-refresh without OAuth credentials.

Configuration Reference

All Environment Variables

Variable

Required

Default

Description

QUIRE_OAUTH_CLIENT_ID

Yes*

-

Quire OAuth Client ID

QUIRE_OAUTH_CLIENT_SECRET

Yes*

-

Quire OAuth Client Secret

QUIRE_ACCESS_TOKEN

No

-

Manual token override (skips OAuth flow)

QUIRE_OAUTH_REDIRECT_URI

No

http://localhost:3000/callback

OAuth callback URL (stdio mode)

QUIRE_TOKEN_STORE_PATH

No

Platform default

Path to token cache file

MCP_TRANSPORT

No

stdio

Transport mode: stdio or http

MCP_SERVER_HOST

No

127.0.0.1

HTTP server bind address

MCP_SERVER_PORT

No

3001

HTTP server port

MCP_ISSUER_URL

No

http://localhost:3001

OAuth issuer URL (HTTP mode)

*Required unless QUIRE_ACCESS_TOKEN is set.

Features

Tools

The server provides 60+ tools organized by category:

Authentication

Tool

Description

quire.whoami

Get the current authenticated user's profile

Organizations

Tool

Description

quire.listOrganizations

List all accessible organizations

quire.getOrganization

Get organization details by ID or OID

quire.updateOrganization

Update organization followers

Projects

Tool

Description

quire.listProjects

List all projects, optionally filtered by organization

quire.getProject

Get project details including task counts

quire.updateProject

Update project name, description, icon, and followers

quire.exportProject

Export project tasks in JSON or CSV format

Tasks

Tool

Description

quire.listTasks

List tasks in a project (root-level or subtasks)

quire.getTask

Get task details by project+ID or OID

quire.createTask

Create a new task with optional priority, dates, assignees, tags

quire.updateTask

Update task properties

quire.deleteTask

Delete a task and its subtasks

quire.searchTasks

Search tasks in a project by keyword and filters

quire.createTaskAfter

Create a task after a specified task

quire.createTaskBefore

Create a task before a specified task

quire.searchFolderTasks

Search tasks within a folder

quire.searchOrganizationTasks

Search tasks across an entire organization

Tags

Tool

Description

quire.listTags

List all tags in a project

quire.getTag

Get tag details by OID

quire.createTag

Create a new tag with name and color

quire.updateTag

Update tag name or color

quire.deleteTag

Delete a tag

Comments

Tool

Description

quire.listTaskComments

List all comments on a task

quire.addTaskComment

Add a comment to a task

quire.updateComment

Update comment text

quire.deleteComment

Delete a comment

quire.listChatComments

List all comments in a chat channel

quire.addChatComment

Add a comment to a chat channel

Users

Tool

Description

quire.getUser

Get user details by ID, OID, or email

quire.listUsers

List all accessible users

quire.listProjectMembers

List all members of a project

Custom Statuses

Tool

Description

quire.listStatuses

List custom statuses in a project

quire.getStatus

Get status details by value

quire.createStatus

Create a custom workflow status

quire.updateStatus

Update status name or color

quire.deleteStatus

Delete a custom status

External Teams (Partners)

Tool

Description

quire.getPartner

Get external team details

quire.listPartners

List all external teams in a project

Documents

Tool

Description

quire.createDocument

Create a document in an organization or project

quire.getDocument

Get document content and metadata

quire.listDocuments

List all documents

quire.updateDocument

Update document name or content

quire.deleteDocument

Delete a document

Sublists

Tool

Description

quire.createSublist

Create a sublist

quire.getSublist

Get sublist details

quire.listSublists

List all sublists

quire.updateSublist

Update sublist name or description

quire.deleteSublist

Delete a sublist

Chat Channels

Tool

Description

quire.createChat

Create a chat channel

quire.getChat

Get chat channel details

quire.listChats

List all chat channels

quire.updateChat

Update chat name, description, or members

quire.deleteChat

Delete a chat channel

Key-Value Storage

Tool

Description

quire.getStorageValue

Get a stored value by key

quire.listStorageEntries

List storage entries by prefix

quire.putStorageValue

Store a value

quire.deleteStorageValue

Delete a stored value

Notifications

Tool

Description

quire.sendNotification

Send notification to users

Attachments

Tool

Description

quire.uploadTaskAttachment

Upload a file attachment to a task

quire.uploadCommentAttachment

Upload a file attachment to a comment

Resources

The server exposes data as MCP resources:

Static Resources

Resource URI

Description

quire://user/me

Current authenticated user's profile

quire://organizations

List of all accessible organizations

quire://projects

List of all accessible projects

Resource Templates

Resource URI

Description

quire://project/{id}

Specific project details and metadata

quire://project/{projectId}/tasks

Root tasks in a project

quire://project/{projectId}/tags

Tags defined in a project

quire://project/{projectId}/statuses

Custom statuses in a project

Prompts

The server provides guided prompts for common workflows:

Prompt

Description

quire.create-project-plan

Generate a task plan from a goal description

quire.daily-standup

Generate a daily standup summary

quire.sprint-planning

Plan a sprint from the backlog

quire.task-breakdown

Break down a complex task into subtasks

quire.weekly-summary

Generate a weekly progress report

Development

Setup

# Clone the repo
git clone https://github.com/jacob-hartmann/quire-mcp.git
cd quire-mcp

# Use the Node.js version from .nvmrc
# (macOS/Linux nvm): nvm install && nvm use
# (Windows nvm-windows): nvm install 22 && nvm use 22
nvm install
nvm use

# Install dependencies
pnpm install

# Copy .env.example and configure
cp .env.example .env
# Edit .env with your OAuth credentials

Running Locally

# Development mode (stdio, auto-reload)
pnpm dev

# Development mode (http, auto-reload)
pnpm dev:http

# Production build
pnpm build

# Production run
pnpm start        # stdio mode
pnpm start:http   # http mode

Debugging

You can use the MCP Inspector to debug the server:

# Run from source
pnpm inspect

# Run from built output
pnpm inspect:dist

pnpm inspect loads .env automatically via dotenv (see .env.example).

If you see Ignored build scripts: esbuild..., run pnpm approve-builds and allow esbuild. In CI we install dependencies with lifecycle scripts disabled (pnpm install --ignore-scripts) and then explicitly rebuild only esbuild for the production build job.

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines on how to contribute to this project.

Security

See SECURITY.md for security policy and reporting vulnerabilities.

Support

This is a community project provided "as is" with no guaranteed support. See SUPPORT.md for details.

License

MIT © Jacob Hartmann

Available Tools

61 tools
quire.addChatCommentA

Add a comment to a chat channel by OID, or by project ID and chat ID.

Inputs: description (required), chatOid, projectId, chatId, +2 more.

quire.addTaskCommentB

Add a comment to a task. Can be accessed by task OID or by project ID + task number.

Inputs: description (required), taskOid, projectId, taskId, +2 more.

quire.createChatB

Create a new chat channel in a project.

Inputs: ownerId (required), name (required), ownerType, id, +6 more.

quire.createDocumentC

Create a new document in an organization or project.

Inputs: ownerType (required), ownerId (required), name (required), id, +6 more.

quire.createStatusA

Create a custom status in a project. Custom statuses allow you to define workflow stages beyond the default To-Do (0) and Complete (100).

Inputs: projectId (required), name (required), value (required), color.

quire.createSublistC

Create a new sublist in an organization, project, folder, or smart-folder.

Inputs: ownerType (required), ownerId (required), name (required), id, +7 more.

quire.createTagB

Create a new tag in a project. Tags help organize and categorize tasks.

Inputs: projectId (required), name (required), global, color.

quire.createTaskA

Create a new task in a project or as a subtask of an existing task. To create a root task, provide a project ID/OID. To create a subtask, provide a parent task OID. To position a task relative to another, use createTaskAfter or createTaskBefore instead.

Inputs: projectId (required), name (required), description, priority, +5 more.

quire.createTaskAfterB

Create a new task immediately after a specified task. The new task will be at the same level as the reference task.

Inputs: taskOid (required), name (required), description, priority, +5 more.

quire.createTaskBeforeA

Create a new task immediately before a specified task. The new task will be at the same level as the reference task.

Inputs: taskOid (required), name (required), description, priority, +5 more.

quire.deleteChatA
Destructive

Delete a chat channel by OID, or by owner type/ID and chat ID. This action cannot be undone.

Inputs: oid, ownerType, ownerId, chatId.

quire.deleteCommentA
Destructive

Delete a comment. This action cannot be undone.

Inputs: oid (required).

quire.deleteDocumentA
Destructive

Delete a document by OID, or by owner type/ID and document ID. This action cannot be undone.

Inputs: oid, ownerType, ownerId, documentId.

quire.deleteStatusA
Destructive

Delete a custom status. Tasks with this status will be reverted to the default To-Do status. You cannot delete the default statuses (0 and 100).

Inputs: projectId (required), value (required).

quire.deleteStorageValueA
Destructive

Delete a stored value by name. This action cannot be undone.

Inputs: name (required).

quire.deleteSublistA
Destructive

Delete a sublist by OID, or by owner type/ID and sublist ID. This action cannot be undone.

Inputs: oid, ownerType, ownerId, sublistId.

quire.deleteTagA
Destructive

Delete a tag. This will remove the tag from all tasks that have it.

Inputs: oid (required).

quire.deleteTaskA
Destructive

Delete a task and all its subtasks. This action cannot be undone.

Inputs: oid (required).

quire.exportProjectA
Read-only

Export all tasks from a project in JSON or CSV format. Useful for backups, analysis, or integrations. Supports progress notifications for large exports when client provides a progressToken.

Inputs: id (required), format, status, merge.

quire.getChatA
Read-only

Get a chat channel by OID, or by owner type/ID and chat ID.

Inputs: oid, ownerType, ownerId, chatId.

quire.getDocumentA
Read-only

Get a document by OID, or by owner type/ID and document ID.

Inputs: oid, ownerType, ownerId, documentId.

quire.getOrganizationA
Read-only

Get detailed information about a specific organization by its ID or OID. Use this to get full details including member count, project count, and followers.

Inputs: id (required).

quire.getPartnerA
Read-only

Get details of an external team (partner) by OID.

Inputs: oid (required).

quire.getProjectA
Read-only

Get detailed information about a specific project by its ID or OID. Returns full project details including task counts, organization, and owner.

Inputs: id (required).

quire.getStatusA
Read-only

Get detailed information about a specific custom status by its value.

Inputs: projectId (required), value (required).

quire.getStorageValueA
Read-only

Get a stored value by name from Quire's key-value storage.

Inputs: name (required).

quire.getSublistA
Read-only

Get a sublist by OID, or by owner type/ID and sublist ID.

Inputs: oid, ownerType, ownerId, sublistId.

quire.getTagA
Read-only

Get detailed information about a specific tag by its OID.

Inputs: oid (required).

quire.getTaskA
Read-only

Get detailed information about a specific task. Can be retrieved by project ID + task ID, or by task OID alone.

Inputs: projectId, taskId, oid.

quire.getUserA
Read-only

Get detailed information about a user by their ID, OID, or email. Returns user profile including name, email, and image.

Inputs: id (required).

quire.listChatCommentsA
Read-only

List all comments on a chat channel by OID, or by project ID and chat ID.

Inputs: chatOid, projectId, chatId.

quire.listChatsA
Read-only

List all chat channels in a project.

Inputs: ownerId (required), ownerType.

quire.listDocumentsA
Read-only

List all documents in an organization, project, folder, or smart-folder.

Inputs: ownerType (required), ownerId (required).

quire.listOrganizationsA
Read-only

List all organizations accessible to the current user. Returns an array of organization objects with basic information.

Inputs: no named parameters.

quire.listPartnersA
Read-only

List all external teams (partners) in a project.

Inputs: projectId (required).

quire.listProjectMembersA
Read-only

List all members of a project. Returns an array of user objects who have access to the project.

Inputs: projectId (required).

quire.listProjectsA
Read-only

List all projects accessible to the current user. Optionally filter by organization, archived status, or write access.

Inputs: organizationId, archived, addTask.

quire.listStatusesA
Read-only

List all custom statuses in a project. Returns an array of status objects with value, name, and color. Default statuses (0=To-Do, 100=Complete) are always available.

Inputs: projectId (required).

quire.listStorageEntriesA
Read-only

List all storage entries with a given prefix. Useful for finding related stored values.

Inputs: prefix (required).

quire.listSublistsA
Read-only

List all sublists in an organization, project, folder, or smart-folder.

Inputs: ownerType (required), ownerId (required).

quire.listTagsA
Read-only

List all tags in a project. Returns an array of tag objects with name, color, and identifiers.

Inputs: projectId (required).

quire.listTaskCommentsA
Read-only

List all comments on a task. Can be accessed by task OID or by project ID + task number.

Inputs: taskOid, projectId, taskId.

quire.listTasksA
Read-only

List tasks in a project. Returns root-level tasks by default, or subtasks if a parent task OID is provided.

Inputs: projectId (required), parentTaskOid.

quire.listUsersA
Read-only

List all users accessible to the current user. Returns an array of user objects with basic profile information.

Inputs: no named parameters.

quire.putStorageValueA
Idempotent

Store a value in Quire's key-value storage. Overwrites any existing value with the same name.

Inputs: name (required), value (required).

quire.searchFolderTasksA
Read-only

Search for tasks within a specific folder by keyword and optional filters.

Inputs: folderId (required), keyword (required), status, priority, +2 more.

quire.searchOrganizationTasksA
Read-only

Search for tasks across an entire organization by keyword and optional filters. This searches all projects within the organization.

Inputs: organizationId (required), keyword (required), status, priority, +2 more.

quire.searchTasksA
Read-only

Search for tasks in a project by keyword and optional filters. Returns tasks matching the search criteria.

Inputs: projectId (required), keyword (required), status, priority, +2 more.

quire.sendNotificationA

Send a notification to the current authorized user. Optionally include a URL that the user can click to navigate to.

Inputs: message (required), url.

quire.updateChatA
Idempotent

Update a chat channel's properties by OID, or by owner type/ID and chat ID.

Inputs: oid, ownerType, ownerId, chatId, +8 more.

quire.updateCommentA
Idempotent

Update an existing comment's text or pin status.

Inputs: oid (required), description, pinned.

quire.updateDocumentB
Idempotent

Update a document's properties by OID, or by owner type/ID and document ID.

Inputs: oid, ownerType, ownerId, documentId, +8 more.

quire.updateOrganizationA
Idempotent

Update an organization's followers. You can set the complete list of followers, or add/remove specific followers.

Inputs: id (required), followers, addFollowers, removeFollowers.

quire.updateProjectC
Idempotent

Update a project's settings including name, description, and followers.

Inputs: id (required), name, description, archived, +3 more.

quire.updateStatusC
Idempotent

Update a custom status's name, value, or color.

Inputs: projectId (required), value (required), name, newValue, +1 more.

quire.updateSublistA
Idempotent

Update a sublist's properties by OID, or by owner type/ID and sublist ID.

Inputs: oid, ownerType, ownerId, sublistId, +9 more.

quire.updateTagA
Idempotent

Update a tag's name, global status, or color.

Inputs: oid (required), name, global, project, +1 more.

quire.updateTaskA
Idempotent

Update an existing task. Can be identified by project ID + task ID, or by task OID alone. Only provided fields will be updated.

Inputs: projectId, taskId, oid, name, +11 more.

quire.uploadCommentAttachmentA

Upload a file attachment to a comment. The content should be provided as a string (e.g., text content or base64-encoded binary).

Inputs: commentOid (required), filename (required), content (required), mimeType.

quire.uploadTaskAttachmentC

Upload a file attachment to a task. The content should be provided as a string (e.g., text content or base64-encoded binary).

Inputs: taskOid (required), filename (required), content (required), mimeType.

quire.whoamiA
Read-only

Get the current authenticated user's profile from Quire. Use this to verify your authentication is working and to see basic information about the connected Quire account.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 61 tools

    Disambiguation5/5

    Each tool targets a distinct resource-action combination (e.g., createTask vs createChat, addTaskComment vs addChatComment). Even related tools like createTask/createTaskAfter/createTaskBefore are clearly differentiated by their descriptions.

    Naming Consistency5/5

    All tools follow a consistent 'quire.{verb}{Resource}' pattern in camelCase (e.g., createTask, listChats, getProject). The verbs (add, create, delete, get, list, search, etc.) are uniform across the set.

    Tool Count4/5

    With 61 tools, the set is large but justified for a comprehensive project management API covering tasks, chats, documents, organizations, projects, storage, and more. However, it slightly exceeds the typical well-scoped range.

    Completeness3/5

    The tool surface covers most core operations (CRUD for tasks, chats, documents, statuses, etc.), but notable gaps exist: add/remove project members, create/delete organizations, and other lifecycle management features are missing.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers