bticket-mcp
Thin MCP server exposing the B-Ticket Laravel Sanctum API so Cursor/Grok can read context and operate a card's full lifecycle without inventing routes.
Authenticate and identify:
bticket_whoami(current user, id, roles).Browse context:
bticket_list_boards,bticket_list_projects,bticket_list_clients(per board),bticket_list_columns,bticket_list_labels,bticket_list_members,bticket_list_repositories.Read cards:
bticket_list_cards(filters: busca, membro_id, etiqueta_id, coluna_id, prazo, atrasado, sem_data, checklist, arquivados;concluidos=truefor done column),bticket_list_my_open_cards(preferboard_uuid),bticket_list_tickets,bticket_get_card(full card).Dashboards & notifications:
bticket_dashboard_stats(stats + team daily report),bticket_list_notifications(with unread count).Create work records:
bticket_create_cardwith hours, member, labels and initial comment; accepts project/board/column by name.Update cards:
bticket_update_card(title, prazo, cliente, projeto, dates, archive),bticket_move_card,bticket_toggle_label,bticket_toggle_member.Hours:
bticket_add_hours,bticket_delete_hours.Comments:
bticket_add_comment(create/edit viacomentario_id/delete viaexcluir=true).Attachments:
bticket_add_attachment(path or base64),bticket_delete_attachment.Checklists:
bticket_add_checklist,bticket_toggle_checklist_item.Repositories:
bticket_link_repository(links at the project level, inheriting from the card).Deployable over stdio (Cursor) or Streamable HTTP/SSE with HTTPS, using Sanctum credentials or a long-lived
BTICKET_TOKEN.
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., "@bticket-mcp show my open cards"
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.
bticket-mcp
Servidor MCP fino que expõe a API Laravel Sanctum do B-Ticket como ferramentas. O Cursor (e o Grok Bot) passam a consultar o B-Ticket e operar um card por completo — horas, comentário, prazo, etiqueta, cliente, projeto, anexo, repositório, checklist e coluna — sem inventar rotas.
As tools de leitura listam contexto. As tools bticket_* de escrita cobrem o ciclo de vida do card. Quadro, projeto, cliente, coluna, etiqueta, membro e repositório aceitam nome (não só id).
O que este servidor faz
Ferramenta MCP | Endpoint B-Ticket |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bticket_list_my_open_cards prefere board_uuid. Sem o UUID, lista os quadros e agrega até 8 boards — isso é mais pesado e deve ser evitado no dia a dia.
Related MCP server: Xalantis MCP Server
Host de produção
A API B-Ticket em produção é https://bticket.brediweb.com.br (sem barra no final). As rotas Laravel ficam em /api, por exemplo:
POST https://bticket.brediweb.com.br/api/user/login
GET https://bticket.brediweb.com.br/api/userUse esse valor em BTICKET_API_URL. Não coloque e-mail, senha nem token no git — só placeholders em .env.example.
Requisitos
Node.js 18+
Acesso HTTPS à API B-Ticket (
https://bticket.brediweb.com.brem produção)Credenciais Sanctum ou um token de longa duração
Setup
git clone https://github.com/Silvio-Batista/bticket-mcp.git
cd bticket-mcp
npm install
npm run buildCredenciais não vão no git. No Cursor elas entram no env do mcp.json (veja Cursor (MCP)). Para npm start / npm run start:http, copie .env.example → .env com os mesmos campos:
BTICKET_API_URL=https://bticket.brediweb.com.br
BTICKET_EMAIL=voce@empresa.com
BTICKET_PASSWORD=sua-senha
BTICKET_TOKEN=
PORT=3000BTICKET_API_URLé a origem sem barra final e sem/api. As chamadas vão para{BTICKET_API_URL}/api/...(produção:https://bticket.brediweb.com.br/api/user/login).Se
BTICKET_TOKENestiver preenchido, o login é ignorado e o token é usado emAuthorization: Bearer ….Sem token, o servidor faz
POST /api/user/logincom{ email, password }, lêresults.token(SanctumplainTextToken) e guarda o valor em memória até o processo reiniciar. Em401subsequente, tenta um novo login (somente quando o token não veio deBTICKET_TOKEN).
Scripts
Script | Uso |
| Compila TypeScript para |
| Transporte stdio — o mesmo que o Cursor chama |
| Transporte Streamable HTTP ( |
| HTTP com reload ( |
| Smoke test com API Laravel mockada |
Cursor (MCP)
O padrão único é stdio via dist/index.js. Sempre o mesmo mcpServers.bticket: command + args + cwd + env. Depois de mudar o código, rode npm run build e reinicie o MCP.
Em Cursor Settings → MCP ou ~/.cursor/mcp.json:
{
"mcpServers": {
"bticket": {
"command": "node",
"args": ["C:\\laragon\\www\\bticket-mcp\\dist\\index.js"],
"cwd": "C:\\laragon\\www\\bticket-mcp",
"env": {
"BTICKET_API_URL": "https://bticket.brediweb.com.br",
"BTICKET_EMAIL": "voce@empresa.com",
"BTICKET_PASSWORD": "sua-senha"
}
}
}
}Ajuste args e cwd para o caminho absoluto deste repositório. Não use url nem SSE neste fluxo.
No mesmo env, em vez de e-mail/senha, pode ir só BTICKET_TOKEN (1|seu-token-sanctum). Não misture os dois modos: ou credenciais de login, ou token.
Reinicie o MCP. Em Output → MCP Logs deve aparecer bticket-mcp 1.2.0 stdio e as tools bticket_*.
Não use console.log no processo stdio: stdout é o protocolo MCP. Logs vão para stderr.
Deploy como MCP remoto (HTTPS)
Mesmo servidor, outro transporte. As credenciais ficam no .env do host (não no mcp.json). Suba com:
npm run build
npm run start:httpGET /health— livenessPOST|GET|DELETE /mcp— Streamable HTTPGET /sse+POST /messages?sessionId=— SSE legado
O processo escuta em 0.0.0.0:$PORT (default 3000), atrás de HTTPS. O bloco no Cursor continua mcpServers.bticket, só troca command/args/cwd/env por url:
{
"mcpServers": {
"bticket": {
"url": "https://seu-mcp.example.com/mcp"
}
}
}Health check: curl https://seu-mcp.example.com/health. Grok Bot / Cloud Agent usa a mesma URL.
Filtros de cards
bticket_list_cards encaminha os query params oficiais:
busca, membro_id, etiqueta_id, cliente_id, projeto_id, coluna_id, data_prazo_de, data_prazo_ate, sem_data, atrasado, checklist_concluido, incluir_arquivados, page, per_page.
membro_id do usuário logado é o campo id de GET /api/user (inteiro numérico da API, enviado como string).
Erros da API
Falhas 401 / 422 / 500 voltam como resultado de tool com isError e o texto de messages, message ou errors do Laravel. Exemplo: credenciais inválidas → B-Ticket API HTTP 401: Suas credenciais estão incorretas.
Testes
npm install
npm test
npm run buildO smoke sobe um HTTP mock no estilo apiResponse do B-Ticket, valida login + cache de token, paths reais, as tools de leitura e a operação do card (horas, comentário, etiqueta, anexo, checklist, repositório) via transporte in-memory do SDK.
Operar um card
Quase todas as tools de escrita pedem card_uuid + board_uuid (ou board pelo nome). A coluna é lida automaticamente em GET /quadro/{uuid}/card/{uuid}.
Criar e registrar o que foi feito
Use bticket_create_card no final de uma missão, por exemplo:
faça isso na tarefa X, projeto Sistema Secretaria, e depois crie um card para registrar 2 horas e o que foi feito
Campos principais:
titulo— obrigatóriodescricao— texto puro (sem HTML) com o pedido e o que foi feitoqtd_horas— lança na API viaPUTqtd_horas(não manda hora no POST de criação)projeto/cliente/board/coluna— por nome ou iddata_prazo,data_inicio,data_entrega—YYYY-MM-DDetiqueta— aplica (e cria no quadro se ainda não existir)comentario— comentário inicialatribuir_a_mim— ligado por padrão
Atualizar um card existente
bticket_get_card— lê o card completo (horas, comentários, anexos, etiquetas, checklists, projeto)bticket_update_card— prazo, cliente, projeto, título, descrição, datas, arquivarbticket_add_hours/bticket_delete_hours— lançamentos decard_horasbticket_add_comment— criar, editar (comentario_id) ou excluir (excluir=true)bticket_toggle_label/bticket_toggle_member— liga/desligabticket_move_card— muda de coluna pelo nome (ex.:Desenvolvimento,Concluído)bticket_add_attachment—arquivo_caminhono disco ouarquivo_base64+arquivo_nomebticket_add_checklist/bticket_toggle_checklist_item
Repositório
O card não tem repositorio_id. O vínculo GitHub é no projeto (POST /api/projeto/{id}/repositorios). Use bticket_list_repositories para buscar e bticket_link_repository com projeto ou card_uuid (herda o projeto do card).
Segurança
.envestá no.gitignore. Só.env.examplecom placeholders entra no git.No Cursor, as credenciais ficam só no
envdemcpServers.bticket(ouBTICKET_TOKENno mesmo objeto).Prefira
BTICKET_TOKENde escopo limitado em produção.Hoste o MCP remoto só em HTTPS e em rede confiável: quem chama o MCP herda o acesso B-Ticket daquele processo.
Available Tools
10 toolsbticket_create_cardCriar card e registrar horasA
Cria um card no B-Ticket para registrar o que foi feito e as horas trabalhadas. Aceita projeto/quadro/coluna por nome (não precisa do id). Fluxo: POST /coluna/{id}/card, opcionalmente PUT com qtd_horas e PATCH para se atribuir ao card. Descrição em texto puro, sem HTML. Se informar qtd_horas e não passar coluna, usa a coluna de Concluído.
Inputs: titulo (required), board, coluna, projeto, +8 more.
bticket_dashboard_statsEstatísticas do dashboardARead-onlyIdempotent
Lê estatísticas e o relatório diário da equipe: GET /api/dashboard/estatisticas e GET /api/dashboard/relatorio-diario-equipe.
Inputs: include_team_daily_report.
bticket_list_boardsListar quadrosARead-onlyIdempotent
Lista os quadros (boards) acessíveis ao usuário autenticado (GET /api/quadros). Cada quadro usa id como UUID.
Inputs: no named parameters.
bticket_list_cardsListar cards de um quadroARead-onlyIdempotent
Lista cards de um quadro B-Ticket. Por padrão GET /api/quadro/{uuid}/cards (colunas ativas). Use concluidos=true para GET /api/quadro/{uuid}/cards/concluidos. Filtros combinam com AND; arrays (membro_id, etiqueta_id, coluna_id) combinam com OR.
Inputs: board_uuid (required), page, busca, atrasado, +12 more.
bticket_list_columnsListar colunas do quadroARead-onlyIdempotent
Lista as colunas de um quadro (GET /api/quadro/{uuid}/colunas), ex.: Desenvolvimento, Aguardando QA, Concluído / Publicado.
Inputs: board_uuid (required).
bticket_list_my_open_cardsMeus cards abertosARead-onlyIdempotent
Atalho para cards abertos do usuário autenticado. Preferência: passe board_uuid — o servidor resolve o membro_id via GET /api/user e chama GET /api/quadro/{uuid}/cards?membro_id={id}. Sem board_uuid, lista GET /api/quadros e agrega cards de cada quadro (pesado; limitado a 8 quadros). Não use agregação se não precisar.
Inputs: busca, atrasado, per_page, board_uuid.
bticket_list_notificationsListar notificaçõesARead-onlyIdempotent
Lista as últimas notificações (GET /api/notificacoes) e inclui a contagem de não lidas (GET /api/notificacoes/contagem) quando include_unread_count não for false.
Inputs: apenas_nao_lidas, include_unread_count.
bticket_list_projectsListar projetosARead-onlyIdempotent
Lista projetos (GET /api/projetos). Use para resolver o nome do projeto antes de criar um card. Filtro opcional busca é aplicado localmente no nome/cliente.
Inputs: page, busca, per_page, cliente_id.
bticket_list_ticketsListar ticketsARead-onlyIdempotent
Lista tickets visíveis ao usuário autenticado (GET /api/tickets). Inclui tickets próprios e de quadros compartilhados, conforme a API.
Inputs: no named parameters.
bticket_whoamiUsuário atualARead-onlyIdempotent
Retorna o usuário autenticado na API B-Ticket (GET /api/user), incluindo id, nome, e-mail, papéis e flags de notificações.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Most tools have distinct purposes, but bticket_list_tickets, bticket_list_cards, and bticket_list_my_open_cards all deal with similar work-item concepts and could be confused. The descriptions clarify some usage differences, but the relationship between tickets and cards is never made explicit.
The bticket_list_* pattern is used consistently across the read operations, and bticket_create_card follows the same verb_noun structure. Minor exceptions are bticket_whoami and bticket_dashboard_stats, which break the expected verb pattern but remain readable.
10 tools is a well-scoped set for this server's purpose. The count covers the main read flows and card creation without bloat or trivial redundancy.
The read side is well covered with boards, cards, tickets, projects, columns, notifications, and stats, but the write side only has bticket_create_card. There is no update, move, delete, or comment operation, which leaves notable gaps for a project-management domain.
Maintenance
Related MCP Connectors
Connects AI assistants to TrackingTime for querying time entries, projects, tasks, customers, and team data using natural language.
Lets Claude, ChatGPT, and Muse read and update your beckett tasks, notes, calendar, and lists.
Create Tasks and run Workflows in Bleep from Claude, ChatGPT, and other AI assistants.
Manage Redbooth tasks, task lists, comments, tags and files from Claude and other AI assistants.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to create tickets and worklog entries in REI3 ticket management systems through the REI3 Tickets API. Supports secure authentication and provides natural language interface for ticket operations.5-

Xalantis MCP Serverofficial
AlicenseAqualityCmaintenanceEnables managing support tickets from Claude, Cursor, and other AI tools, including listing, creating, updating, and replying to tickets.654 npmMIT- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and manage OpenProject projects, work packages, attachments, time tracking, wiki, and users via the OpenProject API v3.-
- AlicenseAqualityDmaintenanceProvides AI assistants with direct access to MantisBT issue trackers via the REST API, enabling reading, updating, resolving, and semantically searching issues.206 npmMIT