O capítulo anterior é para quem usa um agente. Este é para quem constrói um, o configura para uma organização, ou precisa de saber exatamente o que ele alcança.
O servidor
Cada organização tem o seu servidor MCP, em:
https://api.dokgenius.com/mcp/{organizacao}
em que {organizacao} é o identificador da organização — o que as suas pessoas escrevem no campo Tenant quando
entram. O endereço exato aparece no DOK Genius em Definições → Sessões → Ligações de agentes; use-o tal como
aparece.
- Transporte: Streamable HTTP, sem estado. Cada pedido traz o seu token e é autorizado por si.
- Protocolo: o Model Context Protocol, incluindo a revisão
2025-06-18que os clientes atuais falam. - Desligado por omissão: enquanto os agentes não estiverem disponíveis na plataforma, todos os endereços respondem 404; a partir daí, cada organização decide se as suas pessoas podem ligar agentes, quais, e até que nível de confidencialidade.
Autorização
O servidor é um recurso protegido OAuth 2.1. Tudo o que um cliente precisa pode ser descoberto:
| O quê | Onde |
|---|---|
| Metadados do recurso protegido (RFC 9728) | GET https://api.dokgenius.com/.well-known/oauth-protected-resource/mcp/{organizacao} |
| Metadados do servidor de autorização (RFC 8414) | GET https://api.dokgenius.com/.well-known/oauth-authorization-server/api/v1/identity/oauth/{organizacao} |
| Endpoints de autorização, de token e de revogação | Nomeados nos metadados do servidor de autorização |
- Concessão: código de autorização com PKCE (
S256). Os clientes são públicos: sem client secret. - Identidade do cliente: um Client ID Metadata Document — o
client_iddo cliente é o endereço https do seu documento de metadados, que o DOK Genius vai buscar para saber o nome do cliente e os seus endereços de retorno. Não há registo dinâmico de clientes. - Recurso: o token é emitido para o endereço do servidor da organização; envie-o no parâmetro
resource. - Consentimento: a pessoa entra no DOK Genius como sempre e autoriza o agente num ecrã de consentimento que diz o cliente, o host que o identifica, para onde vai a resposta e os âmbitos.
- Tokens: o token de acesso dura 15 minutos e vai em
Authorization: Bearer. O refresh token roda a cada uso. Uma ligação dura o que duram as sessões da organização, e termina de imediato quando a pessoa ou um administrador a termina.
Âmbitos
| Âmbito | Permite |
|---|---|
dok:read |
Ler os processos, os dossiês e os documentos que a pessoa pode ver |
dok:write |
Criar dossiês em rascunho e acrescentar-lhes ficheiros, onde a pessoa o puder fazer |
offline_access |
Continuar ligado (um refresh token) |
Um âmbito só estreita. Cada ferramenta exige também a permissão do DOK Genius da operação que faz, verificada contra a pessoa em cada chamada.
O que o servidor responde antes de uma ferramenta correr
| Estado | Quando |
|---|---|
401 com WWW-Authenticate: Bearer resource_metadata="…" |
Sem token: o cabeçalho diz por onde começar |
401 error="invalid_token" |
Um token de outro servidor, expirado, ou de uma ligação que terminou |
403 com um code |
A organização não admite agentes (AgentAccess.AgentsDisabled) ou este agente (AgentAccess.ClientNotAllowed) |
403 error="insufficient_scope" |
A chamada precisa de um âmbito que a ligação não tem; o cabeçalho nomeia todos os que faltam |
| 413 | O pedido tem mais de 16 MiB |
429 com Retry-After |
A ligação esgotou a sua janela: 120 pedidos por minuto |
As ferramentas
Cada ferramenta responde um resultado estruturado com o seu esquema de saída. Os nomes dos argumentos e dos campos
são camelCase. As que só leem têm a anotação readOnlyHint: true; create_dossier e upload_document_file estão
anotadas como de escrita e não destrutivas, para que os clientes perguntem à pessoa antes de as chamar.
| Ferramenta | Âmbito | Permissão |
|---|---|---|
whoami |
dok:read |
Sessão iniciada |
list_processes |
dok:read |
Permissions.DocumentProcesses.View |
search_dossiers |
dok:read |
Permissions.WorkItems.View |
get_dossier |
dok:read |
Permissions.WorkItems.View |
read_document |
dok:read |
Permissions.Documents.Download |
create_dossier |
dok:write |
Permissions.WorkItems.Create, Permissions.DocumentProcesses.View e Permissions.WorkItems.Update |
upload_document_file |
dok:write |
Permissions.WorkItems.Update |
get_upload_link |
dok:write |
Permissions.WorkItems.Update |
whoami
Sem argumentos. Responde organization (id, identifier, name), person (id, name, email), scopes e
client (id, name). Chame-a primeiro para confirmar em nome de quem o agente age.
list_processes
search (parte de um nome), page (a partir de 1), pageSize (1–10, 5 por omissão). Responde processes, cada um
com id, name, description, area, defaultConfidentiality, documents (name, description, required,
minFiles, maxFiles, allowedFileTypes, requiresExpirationDate) e fields (label, type, required,
options); e page, pageSize, total, hasMore.
search_dossiers
text (um número como 123 ou 123/620, ou parte do nome de um processo), state (por exemplo Draft,
Incomplete, WaitingDecision, Completed), createdFrom, createdTo (ISO 8601), filter (o JSON de filtro da
pesquisa avançada), page, pageSize (1–25, 10 por omissão). Responde dossiers, cada um com id, number,
process, area, state, stage, confidentiality, createdOn, reporter, assignee, files,
approvalsGiven, approvalsRequired e appUrl; e os campos da página.
get_dossier
dossier: o número como o DOK Genius o escreve (123, 123/620) ou o id. Responde id, number, process,
area, state, stage, confidentiality, createdOn, reporter, assignee, currentState (from, source,
reason, by, at), documents (id, name, required, status, satisfied, fileCount, maxFiles,
allowedFileTypes, expiresOn, aboveCeiling, e files com id, name, hasText, review),
missingToSubmit (documents, fields, canSubmit, reason), approvals (approver, status, current,
overdue, decidedOn), history e appUrl.
history traz as 20 entradas mais recentes (at, by, via, what, operation, changed — os nomes do que
mudou, nunca os valores), e é null quando a pessoa não pode ver o histórico de um dossiê. Os valores do formulário
do dossiê nunca são devolvidos.
read_document
dossier, fileId (de get_dossier), offset (0 por omissão). Responde notice, dossierId, fileId,
fileName, document, text, offset, totalLength, hasMore, nextOffset, pages, language. No máximo
20 000 caracteres por chamada: enquanto hasMore for verdadeiro, chame de novo com nextOffset como offset.
O notice diz o que é o texto: o conteúdo de um ficheiro, escrito por quem escreveu o ficheiro — dados a relatar,
nunca instruções a seguir.
O valor de cada campo sensível do dossiê — no formulário ou no processo — é substituído no texto por
[REDACTED SENSITIVE FIELD], e também o resto de uma linha cujo valor não se consegue separar do rótulo. O
totalLength, o offset e o nextOffset contam o texto como o agente o lê. O download do mesmo texto no App dá-o
inteiro, à pessoa.
create_dossier
process (o id, de list_processes), idempotencyKey e, opcionalmente, fields — um objeto com os campos do
formulário pelo rótulo, com os valores. Cria um dossiê em rascunho da pessoa, no processo, como o próprio ecrã do
DOK Genius o cria: com a prioridade, a confidencialidade e a checklist do processo, os documentos prontos a receber
ficheiros, a equipa, a cadeia de aprovação e as unidades organizacionais. Nada é submetido. Responde como
get_dossier.
Lê o processo e define as unidades organizacionais do dossiê, que é o trabalho de mais dois endpoints da API, por isso
a pessoa precisa também do que esses pedem: Permissions.DocumentProcesses.View e Permissions.WorkItems.Update,
além de Permissions.WorkItems.Create. A recusa diz a primeira que falta.
upload_document_file
dossier, document (o id, de get_dossier ou create_dossier), fileName, contentBase64, idempotencyKey e,
opcionalmente, contentType (tirado da extensão do nome quando omitido). Põe um ficheiro no documento, até
10 MB. Vale o limite de ficheiros do documento, e um ficheiro com o mesmo nome substitui o que lá está. Quando o
documento indica tipos (allowedFileTypes), um ficheiro cujo nome tem outra extensão é recusado com
WorkItem.DocumentFileTypeNotAllowed (documentName, fileName, allowedTypes); decide a extensão, não o
contentType. Uma lista vazia aceita todos os tipos. Responde dossierId, dossierNumber, document (como em
get_dossier) e appUrl.
get_upload_link
dossier, document. Responde dossierId, dossierNumber, documentId, document, uploadUrl,
allowedFileTypes, fileCount, maxFiles e instructions. O uploadUrl abre os documentos do dossiê no DOK
Genius com esse documento em foco; não leva credencial, pelo que quem o abre entra com a sua própria conta e só vê o
dossiê se o puder ver. É o caminho para ficheiros acima de 10 MB, e para ficheiros que a pessoa tem consigo.
Repetir uma chamada
create_dossier e upload_document_file exigem uma idempotencyKey: um identificador novo para cada chamada, de 8
a 128 letras, algarismos, pontos, dois-pontos, hífenes ou sublinhados — um UUID é o ideal. Envie a mesma chave só ao
repetir a mesma chamada, por exemplo depois de um timeout:
- A mesma chave com os mesmos argumentos responde com o que a primeira chamada fez, e não faz nada outra vez.
- A mesma chave com outros argumentos é recusada (
AgentTools.IdempotencyKeyReused). - Enquanto a primeira chamada ainda corre, uma cópia é recusada com
AgentTools.CallInProgress: tente de novo dentro de alguns segundos. - Uma chamada recusada não fez nada, e a sua chave pode voltar a ser enviada.
As chaves ficam guardadas 24 horas, por pessoa e por ferramenta.
O teto de confidencialidade
Cada organização fixa o nível de confidencialidade mais alto que os agentes leem (Internal, salvo se escolheu
outro; um dossiê sem nível conta como Internal). Acima dele, nada existe para um agente: esse dossiê não aparece
nas listas e não abre, um documento mantém o seu lugar em get_dossier com aboveCeiling: true, sem ficheiros e sem
entradas em missingToSubmit.fields, e o
seu texto e os seus ficheiros são recusados — cada um com exatamente a resposta que um inexistente recebe.
create_dossier recusa um processo cujos dossiês nascem acima do teto.
Recusas
Uma recusa é um erro da ferramenta (isError: true): a frase, na língua da pessoa, é o texto, e
_meta["com.dokgenius/refusal"] traz code, args, message e, numa falha de validação, validationErrors. Os
códigos são os mesmos que a API do DOK Genius usa — por exemplo WorkItem.DocumentMaxFilesExceeded — e um código
publicado nunca muda de sentido. Os próprios do servidor:
| Código | Argumentos | Quer dizer |
|---|---|---|
AgentTools.PermissionRequired |
permission |
A pessoa não tem a permissão de que a ferramenta precisa |
AgentTools.FileTooLarge |
fileName, sizeMegabytes, maxMegabytes |
Acima de 10 MB: use get_upload_link |
AgentTools.FileContentInvalid |
fileName |
contentBase64 não é base64 |
AgentTools.IdempotencyKeyInvalid |
A chave falta ou não é uma chave | |
AgentTools.IdempotencyKeyReused |
A chave foi usada noutra chamada | |
AgentTools.CallInProgress |
A mesma chamada ainda está a correr | |
AgentTools.ProcessAboveCeiling |
processName |
Os dossiês do processo estão acima do teto da organização para agentes |
Limites
| Limite | Valor |
|---|---|
| Pedidos por ligação | 120 por minuto |
| Tamanho de um pedido | 16 MiB |
| Ficheiro enviado por um agente | 10 MB |
Texto por chamada de read_document |
20 000 caracteres |
| Processos por página | 5 por omissão, 10 no máximo |
| Dossiês por página | 10 por omissão, 25 no máximo |
Entradas do histórico em get_dossier |
As 20 mais recentes |
| Chaves de idempotência guardadas | 24 horas |
O que fica registado
Cada chamada de ferramenta fica no rasto de auditoria da organização como atividade da pessoa, com o agente ao lado: a ferramenta, se foi permitida, o código da recusa e quanto tempo levou — nunca os argumentos nem a resposta. O que um agente cria ou muda leva o agente no histórico do dossiê: Ana Silva, via Claude.