{"@context":"https://schema.org","@type":"DataFeed","name":"Siglata public website and documentation","dataFeedElement":[{"@type":"WebPage","name":"Blog Siglata · A operação, em perspectiva.","description":"Ideias e guias para quem quer reduzir o trabalho repetitivo e cuidar melhor da operação.","url":"https://www.siglata.com/blog","inLanguage":"pt-BR","text":"# Blog Siglata\n\nIdeias e guias para quem quer reduzir o trabalho repetitivo e cuidar melhor da operação.\n\n- [O que é a Siglata e no que acreditamos](/blog/o-que-e-a-siglata): Por que aplicamos IA aos processos de cada empresa, junto de quem conhece a operação."},{"@type":"WebPage","name":"O que é a Siglata e no que acreditamos","description":"Por que aplicamos IA aos processos de cada empresa, junto de quem conhece a operação.","url":"https://www.siglata.com/blog/o-que-e-a-siglata","inLanguage":"pt-BR","text":"# O que é a Siglata e no que acreditamos\n\nAplicamos IA ao trabalho com dados e planilhas, junto de quem conhece a operação.\n\nEquipe Siglata · 15 set. 2026\n\nA Siglata desenvolve tecnologia para automatizar rotinas que dependem de dados e planilhas. Nossos engenheiros conectam os sistemas da empresa e implantam as automações com a equipe. Esse trabalho pode envolver a conferência de vendas ou a preparação de uma compra com base no estoque.\n\nCriamos a Siglata porque acreditamos que quem toca uma empresa deveria gastar menos tempo repetindo conferências e copiando informações entre sistemas. Queremos que esse tempo volte para o trabalho que precisa da atenção dessas pessoas.\n\n## O conhecimento já está na empresa\n\nUma planilha construída ao longo dos anos reúne decisões sobre como o negócio funciona. Quem a usa sabe quais dados merecem cuidado e quais exceções se repetem a cada mês. Começamos ouvindo essas pessoas e acompanhando o processo que elas já fazem.\n\n## A implantação faz parte do trabalho\n\nNossa tecnologia permite que agentes de IA consultem e cruzem dados de planilhas. Para isso ser útil, precisamos entender os arquivos que chegam, as regras de conferência e o resultado de que a equipe precisa. Nossos engenheiros fazem essa adaptação e testam a rotina com situações da própria empresa.\n\nComeçamos com um processo de escopo definido. A equipe usa o resultado, aponta o que precisa mudar e participa dos ajustes. Depois, avaliamos juntos o que vale ampliar.\n\n## A equipe define o que pode ser automatizado\n\nAutomatizar uma conferência e autorizar uma compra são decisões diferentes. A equipe define quais etapas podem rodar sozinhas e quais precisam de revisão. Uma sugestão de reposição, por exemplo, pode chegar com as quantidades e os dados usados no cálculo, para que alguém confira antes de fazer o pedido.\n\n## O resultado precisa aparecer na rotina\n\nAvaliamos o trabalho pelo que muda na operação. A equipe deixou de copiar os mesmos dados toda semana? Consegue encontrar uma diferença sem refazer a conferência inteira? Queremos que a automação libere tempo para atender um cliente ou tomar uma decisão que depende da experiência de quem trabalha ali.\n\nSe uma rotina assim faz parte do seu dia, queremos entender como ela funciona na sua empresa."},{"@type":"WebPage","name":"Blog Siglata · Operations, in perspective.","description":"Ideas and guides for teams looking to reduce repetitive work and take better care of their operations.","url":"https://www.siglata.com/en-US/blog","inLanguage":"en-US","text":"# Blog Siglata\n\nIdeas and guides for teams looking to reduce repetitive work and take better care of their operations.\n\n- [What Siglata is and what we believe](/en-US/blog/o-que-e-a-siglata): Why we apply AI to each company's processes, alongside the people who know the work."},{"@type":"WebPage","name":"What Siglata is and what we believe","description":"Why we apply AI to each company's processes, alongside the people who know the work.","url":"https://www.siglata.com/en-US/blog/o-que-e-a-siglata","inLanguage":"en-US","text":"# What Siglata is and what we believe\n\nWe apply AI to work with data and spreadsheets, alongside the people who know the operation.\n\nSiglata team · Sep 15, 2026\n\nSiglata builds technology to automate routines that depend on data and spreadsheets. Our engineers connect a company's systems and implement the automation with its team. That work might involve checking sales records or preparing a purchase based on stock levels.\n\nWe started Siglata because we believe the people running a business should spend less time repeating checks and copying information between systems. We want them to have that time for work that needs their attention.\n\n## The knowledge is already in the company\n\nA spreadsheet built over years contains decisions about how the business works. The people using it know which data needs care and which exceptions turn up every month. We start by listening to them and following the process they already use.\n\n## Implementation is part of the work\n\nOur technology lets AI agents query and compare spreadsheet data. To make that useful, we need to understand the incoming files, the checking rules, and the result the team needs. Our engineers adapt the technology and test the routine against situations from the company itself.\n\nWe start with one process and an agreed scope. The team uses the result, points out what needs to change, and helps refine it. Then we decide together what is worth expanding.\n\n## The team decides what to automate\n\nAutomating a check and authorizing a purchase are different decisions. The team chooses which steps can run on their own and which need review. A replenishment suggestion, for example, can include quantities and the data used to calculate them, so someone can check it before placing an order.\n\n## The result has to help with daily work\n\nWe judge the work by what changes in the operation. Has the team stopped copying the same data every week? Can someone find a discrepancy without repeating the entire check? We want automation to free up time to help a customer or make a decision that needs the experience of the people working there.\n\nIf a routine like this is part of your day, we would like to understand how it works in your company."},{"@type":"WebPage","name":"Sobre a Siglata · Seu negócio merece o seu tempo","description":"Conheça a visão e os fundadores da Siglata. Tecnologia e engenheiros para diminuir o trabalho repetitivo na sua empresa.","url":"https://www.siglata.com/about","inLanguage":"pt-BR","text":"# Seu negócio merece o seu tempo.\n\nAcreditamos que quem toca uma empresa deveria ter mais tempo para clientes, equipe e decisões. Criamos tecnologia para tirar o trabalho repetitivo do caminho.\n\n## O conhecimento já está dentro da empresa.\n\nEle aparece na planilha que alguém construiu, no sistema usado há anos e no jeito que a equipe encontrou de fazer o trabalho acontecer.\n\nÉ desse ponto que partimos. Desenvolvemos tecnologia para agentes trabalharem com dados e planilhas. Nossos engenheiros a aplicam aos processos de cada empresa, junto de quem conhece a operação.\n\nA Siglata nasceu para aproximar o que a IA pode fazer do que uma empresa precisa resolver todos os dias.\n\n## Três ideias orientam o nosso trabalho.\n\n### Respeitar o que já existe.\n\nSua empresa carrega anos de conhecimento. Começamos pelos processos, pelos sistemas e por quem faz tudo funcionar.\n\n### Construir perto de quem usa.\n\nA tecnologia melhora quando encontra o trabalho real. Implantamos, ouvimos a equipe e ajustamos o que precisa funcionar melhor.\n\n### Devolver tempo às pessoas.\n\nAutomatizar faz sentido quando abre espaço para atender melhor, decidir com clareza e cuidar do que faz a empresa crescer.\n\n## Uma empresa feita para trabalhar perto.\n\nDe Franca, São Paulo, Brasil.\n\n### Angelica Lima Lopes\n\nCofundadora\n\n### Benjamin Tang\n\nCofundador\n\n## Um piloto de 30 dias na sua operação.\n\nImplementamos um processo e avaliamos o resultado com sua equipe. Cada projeto é orçado conforme o processo e o escopo do piloto.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Fale com a gente","description":"Conte qual fluxo de trabalho precisa melhorar. Converse com nossos engenheiros sobre como colocar a tecnologia da Siglata em uso em um piloto de 30 dias.","url":"https://www.siglata.com/contact","inLanguage":"pt-BR","text":"# Fale com a Siglata\n\nConte para a gente qual rotina mais toma o tempo da sua equipe. Trabalhamos com processos baseados em planilhas ou que podem ser organizados em tabelas: vendas, estoque, compras, cadastros e relatórios.\n\n[Converse pelo WhatsApp](https://wa.me/5563992943367) ou envie um e-mail para [angelica@siglata.com](mailto:angelica@siglata.com).\n\nFranca, São Paulo, Brasil.\n\n## Um piloto de 30 dias na sua operação\n\nEscolhemos juntos um processo, definimos o que melhorar, implementamos com a sua equipe e avaliamos o resultado na prática.\n\n[Como trabalhamos](/how-we-work) · [Nossa tecnologia de planilhas](/spreadsheets)\n\n## Suporte e segurança\n\nPara suporte de uma conta existente, escreva para support@mail.siglata.com. Para relatar um problema de segurança, use security@mail.siglata.com. Inclua a organização e o contexto do problema, sem enviar senhas ou credenciais."},{"@type":"WebPage","name":"About Siglata","description":"We build technology to give business owners and their teams more time for customers, decisions and growth.","url":"https://www.siglata.com/en-US/about","inLanguage":"en-US","text":"# Your business deserves your time.\n\nWe believe business owners should have more time for customers, their team and decisions. We build technology to take repetitive work off their hands.\n\n## The expertise is already in your business.\n\nIt lives in the spreadsheet someone built, the system used for years and the ways your team has found to get things done.\n\nThat is where we start. We build technology for agents to work with data and spreadsheets. Our engineers apply it to each business alongside the people who know the work.\n\nSiglata brings what AI can do closer to what a business needs to solve every day.\n\n## Three ideas guide our work.\n\n### Respect what is already there.\n\nYour business holds years of knowledge. We start with its processes, systems and the people who keep them running.\n\n### Build alongside the people using it.\n\nTechnology improves through real work. We implement, listen to your team and adjust what needs to work better.\n\n### Give people their time back.\n\nAutomation matters when it creates room to serve customers, make better decisions and help the business grow.\n\n## A company built to work alongside you.\n\nFrom Franca, São Paulo, Brazil.\n\n### Angelica Lima Lopes\n\nCo-founder\n\n### Benjamin Tang\n\nCo-founder\n\n## A 30-day pilot in your operation.\n\nWe implement a workflow and evaluate the results with your team. Each project is quoted according to the workflow and the scope of the pilot.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Contact us","description":"Tell us which workflow needs to improve. Talk with our engineers about putting Siglata’s technology to work in a 30-day pilot.","url":"https://www.siglata.com/en-US/contact","inLanguage":"en-US","text":"# Contact Siglata\n\nTell us which routine takes up your team's time. We work with spreadsheet workflows and processes that can be organized in tables: sales, inventory, purchasing, product records and reports.\n\n[Message us on WhatsApp](https://wa.me/5563992943367) or email [angelica@siglata.com](mailto:angelica@siglata.com).\n\nFranca, São Paulo, Brasil.\n\n## A 30-day pilot in your operation\n\nTogether, we choose a process, define what to improve, implement it with your team and evaluate the result in practice.\n\n[How we work](/en-US/how-we-work) · [Our spreadsheet technology](/en-US/spreadsheets)\n\n## Support and security\n\nFor existing-account support, email support@mail.siglata.com. To report a security issue, use security@mail.siglata.com. Include the organization and context without sending passwords or credentials."},{"@type":"WebPage","name":"Siglata developer resources","description":"OpenAPI, MCP, OAuth discovery, and magic-link onboarding for agents integrating with Siglata.","url":"https://www.siglata.com/en-US/for-agents","inLanguage":"en-US","text":"# Siglata developer resources\n\nThis page is the index of Siglata's public machine interfaces. There is no API key dashboard and no sales step. A person signs in with a magic link. An agent registers an OAuth client and completes the authorization code flow.\n\n## Start without credentials\n\n- OpenAPI: https://www.siglata.com/api/openapi.json (also /openapi.json)\n- Health: GET https://www.siglata.com/api\n- Agent guide: https://www.siglata.com/llms.txt\n- Docs: https://www.siglata.com/docs\n- In-browser agents (Chrome 149+ WebMCP): this site registers open_app, open_docs, open_developer_resources, list_pages, and get_page tools via document.modelContext\n\n## Authenticate\n\nHumans open https://www.siglata.com/app/sign-in and follow a magic-link email. That creates a free organization with a 10 GiB quota.\n\nAgents register at POST /auth/oauth2/register (unauthenticated dynamic client registration), then authorize against https://www.siglata.com/v1/mcp.\n\n## Call the product\n\nPOST https://www.siglata.com/v1/mcp (Streamable HTTP). Unauthenticated calls return 401 with WWW-Authenticate. tools/list returns exactly two tools, execute and search. Management operations run as CallScript functions inside an execute script. File bytes move on authenticated PUT /v1/mcp/uploads/{uploadId}/parts/{partNumber} and GET /v1/mcp/files/{fileId}/download. Human install hub: https://www.siglata.com/docs/agents/connect (Cursor and Codex proven for v1; ChatGPT Desktop, Claude Desktop, and VS Code listed as installable / spec-compatible). This page is the machine-facing index only.\n\nPublic NLWeb search: https://www.siglata.com/docs/en-US/nlweb. Query the website and documentation with POST /ask; results include sources. It requires no authentication and cannot access organization files."},{"@type":"WebPage","name":"How we work · Siglata","description":"Start with a 30-day pilot. Our engineers connect your data and adapt automation to your business alongside your team.","url":"https://www.siglata.com/en-US/how-we-work","inLanguage":"en-US","text":"# Technology that fits your business.\n\nYour processes have a history. Our engineers join the operation to understand it and make automation work alongside your team.\n\nWe start with the work your team already does every day.\n\n## Start with one process. Improve it together.\n\nA 30-day pilot gives us a concrete start: choose the problem, work with real data and evaluate the result in your operation.\n\n### Choose the right work.\n\nYour team walks us through the process, systems and time-consuming steps. Together, we define the scope and how to measure improvement.\n\nOne process, one owner and one expected result.\n\n### Put the technology to work.\n\nOur engineers connect the data, adapt the automation and test exceptions with your team, using real situations from the business.\n\nA working routine using your company's data.\n\n### Follow the work in practice.\n\nYour team uses the results and tells us what needs to change. We adjust the process and decide together what to expand after the pilot.\n\nObserved results and feedback from the people using the routine.\n\n## From inventory to the next purchase.\n\nInventory lives in the ERP. Sales arrive in another report. Each week, someone combines the files to find out what needs restocking.\n\nSiglata gathers the data, compares sales rates and prepares a replenishment proposal. Your team reviews quantities and decides what to buy.\n\n## Keep what works. Fix what takes time.\n\nImplementation starts with your systems and your team's knowledge. We apply the technology where the work needs help.\n\n### Your systems stay.\n\nWe extract data from the systems your business already uses, including those without an available integration.\n\n### Your team stays involved.\n\nThe people who know the operation define the rules, test exceptions and check results alongside our engineers.\n\n### You set the decisions.\n\nYour team decides what can run independently and what needs review before the next step.\n\n## Work that fits in rows and columns.\n\nSales, inventory, purchasing, product records and reports. We automate spreadsheet workflows and work that can be organized in tables.\n\n### What we don’t do\n\n- Machine and equipment automation\n\n- Design and content creation\n\n- Audiovisual production\n\n## A 30-day pilot in your operation.\n\nWe implement a workflow and evaluate the results with your team. Each project is quoted according to the workflow and the scope of the pilot.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Siglata · AI at work in your business","description":"We connect your systems and automate spreadsheet work. Our engineers implement the technology alongside your team.","url":"https://www.siglata.com/en-US/","inLanguage":"en-US","text":"# AI at work in your business.\n\nWe connect your systems and automate spreadsheet work. Our engineers handle implementation alongside your team.\n\n## Your business already runs on spreadsheets.\n\nSales, inventory and purchasing move through rows and columns every day. We connect data from your systems and put agents to work with it, alongside your team.\n\n### Connect your systems.\n\nWe gather data from the systems you already use, even when no integration is available.\n\n### Automate spreadsheet work.\n\nWe combine and check your spreadsheets to turn scattered data into results ready for review.\n\n### Work with our engineers.\n\nWe adapt the technology to your operation and implement it alongside the people who know your business.\n\n## Where the work happens.\n\nSales, inventory and purchasing. Every business works differently.\n\n### A clearer view of your business.\n\nSales by product, store and period.\n\n### Know what needs restocking.\n\nOrders, inventory and follow-through.\n\n### See what sells best.\n\nBring together ERP and partner reports to compare sales by product, channel and period.\n\n### Know what needs restocking.\n\nCompare stock with recent sales and review replenishment before products run out.\n\n### Prepare the next order.\n\nGather replenishment needs and prepare a purchase proposal for your team to review.\n\n## From files to the next step.\n\nAn inventory workflow: compare what is in stock with what is selling, then prepare the next purchase.\n\n### Keep the systems you already use.\n\nSiglata brings together ERP inventory, sales and product records to help you follow the operation.\n\n| File          | Source          | Records |\n| ------------- | --------------- | ------- |\n| Estoque.xlsx  | ERP             | 4       |\n| Vendas.csv    | Sales           | 4       |\n| Produtos.xlsx | Product records | 4       |\n\nTechnology that works with the AI agents you already use.\n\n- Codex\n\n- Hermes Agent\n\n- Grok Bot\n\n## Inside your business. Alongside your team.\n\nEvery business works differently. Our engineers join the operation to understand its processes and make automation work with the people who know it best.\n\n## Work that fits in rows and columns.\n\nSales, inventory, purchasing, product records and reports. We automate spreadsheet workflows and work that can be organized in tables.\n\n### What we don’t do\n\n- Machine and equipment automation\n\n- Design and content creation\n\n- Audiovisual production\n\n## Your business deserves your time.\n\nRunning a business should leave more time for customers, your team and decisions. Less time copying data from one place to another.\n\nWe build technology to take that work off your hands. And we work inside each operation to apply it, respecting the expertise of the people who keep it running.\n\n## A 30-day pilot in your operation.\n\nWe implement a workflow and evaluate the results with your team. Each project is quoted according to the workflow and the scope of the pilot.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Pilot pricing and scope | Siglata","description":"Each project is quoted according to the workflow and the scope of the pilot.","url":"https://www.siglata.com/en-US/how-we-work#piloto","inLanguage":"en-US","text":"# Pilot pricing and scope\n\nEach project is quoted according to the workflow and the scope of the pilot.\n\nWe start with a 30-day pilot in your operation. We define a workflow, implement it with your team and evaluate the results.\n\n[See how we work](/en-US/how-we-work#piloto) · [Message on WhatsApp](https://wa.me/5563992943367)"},{"@type":"WebPage","name":"Privacy policy","description":"Siglata stores the minimum needed to run organizations and files. This page is the public description of that data. It is not a substitute for the contract of a specific customer, and it does not apply to content you store in files. File bytes belong to the organization that uploaded them.","url":"https://www.siglata.com/en-US/privacy","inLanguage":"en-US","text":"# Privacy policy\n\nSiglata stores the minimum needed to run organizations and files. File bytes belong to the organization that uploaded them.\n\n## Account data\n\nSign-in uses an email address and a one-time magic link. We store that email, session records, and organization membership. We do not store a password. Locale preference may be stored in a cookie named `siglata-locale`.\n\n## Organization and file data\n\nFile names, sizes, media types, folder membership, visibility, and access grants are stored with the organization. Trashed files remain until the 30-day recovery window ends. Storage usage counts active and trashed files against the organization's quota.\n\n## Agent access\n\nMCP clients receive an OAuth grant bound to one organization and a list of scopes. Ending the session or removing the member ends access. We do not issue long-lived unscoped API keys.\n\nTo export or delete an account, email support@mail.siglata.com from the address on the account. Security issues go to security@mail.siglata.com."},{"@type":"WebPage","name":"Inventory replenishment based on sales · Siglata","description":"Compare inventory with sales and prepare a purchase proposal your team can check.","url":"https://www.siglata.com/en-US/reposicao","inLanguage":"en-US","text":"# Restock based on what sells.\n\nCompare inventory with sales and prepare a purchase proposal your team can check.\n\nBuilt around the systems you already use. Implemented with your team.\n\n## What needs attention before the next purchase.\n\nIllustrative example · Last 7 days. The same stock can last three days or three weeks. The sales rate changes the decision.\n\n| Product | Stock | Sales / 7 days | Coverage | Next step |\n| --- | --: | --: | --: | --- |\n| Coffee 500 g | 18 units | 42 units | 3 days | Review replenishment |\n| Olive oil 500 ml | 36 units | 28 units | 9 days | Review replenishment |\n| Rice 5 kg | 70 units | 35 units | 14 days | Monitor |\n| Sugar 1 kg | 40 units | 14 units | 20 days | Monitor |\n\nCoverage = available stock ÷ average daily sales.\n\nIn this example, items with fewer than 10 days of coverage go to review. Your team defines the actual rule.\n\nThe list explains the signal. Your team decides what to buy. Coverage is an estimate based on the observed period. Supplier lead times, open orders and seasonality are reviewed before quantities are set.\n\n## The calculation is only part of replenishment.\n\nWe define the criteria with the people who buy, sell and track inventory every day.\n\n### Compare like with like.\n\nProducts, locations, units of measure and time periods need to match before the files are combined.\n\n### Account for what is already on its way.\n\nSupplier lead times, minimum order sizes and open orders help determine when and how much to buy.\n\n### Flag what needs checking.\n\nMismatched records, outdated stock balances and unusual sales remain visible for review.\n\n### Keep purchasing decisions with your team.\n\nThe proposal brings together the data and the reason for each item. The people who know the operation approve the next step.\n\n## Before you begin.\n\n### Do I need to replace my ERP?\n\nWe start with the systems and files you already use. In the first conversation, we assess how to obtain the data and keep the routine up to date.\n\n### Does Siglata place purchase orders automatically?\n\nThis workflow produces a proposal for review. Any additional automated step must be agreed with your team as part of the scope.\n\n### What if my product records do not match?\n\nImplementation includes checking identifiers, units and time periods. Differences must be resolved or flagged before they inform a purchase.\n\n### How does the pilot work?\n\nWe choose one process and a defined part of the operation for a 30-day pilot. Scope, evaluation criteria and pricing are agreed before work begins.\n\n[Talk about your replenishment](https://wa.me/5563992943367)"},{"@type":"WebPage","name":"Spreadsheet technology · Siglata","description":"Technology built for agents to query, combine and process spreadsheet data. Implemented in your business by Siglata engineers.","url":"https://www.siglata.com/en-US/spreadsheets","inLanguage":"en-US","text":"# Excel was built for people. Our technology is built for agents.\n\nExcel is a great editor. An agent needs a different way to work: query tables, combine data and execute whole steps without editing one cell at a time.\n\n## How is each store performing?\n\nThe agent queries the sales table, compares it with targets and returns a summary for review.\n\n| Store   | Sales     | Target    |\n| ------- | --------- | --------- |\n| Centro  | R$ 84.200 | R$ 80.000 |\n| Estação | R$ 62.400 | R$ 60.000 |\n| Jardins | R$ 71.800 | R$ 75.000 |\n\n## Spreadsheet data. Tools for agents.\n\nMany businesses run on rows and columns. Our technology preserves that structure and gives agents direct access to the data and operations they need.\n\n### Process the whole dataset.\n\nSQL queries filter, group and join entire tables. The agent works with the data without moving through every cell in the interface.\n\n### Combine steps in one call.\n\nThe agent organizes several operations into a plan. Results pass from one step to the next without returning to the model after each call.\n\n### Keep the heavy work off your computer.\n\nProcessing runs in the cloud, controlled by agents. Your computer handles querying and reviewing the results.\n\n## What we measured.\n\nA local technical test with generated sales, product and store data. These numbers measure the query engine and the way calls are organized.\n\n### sales rows\n\nData for 1,000 products and 50 stores, already loaded in memory.\n\n### for eight queries\n\nMedian of seven runs, including filters, totals and table joins.\n\n### calls made by the agent\n\nThe same eight operations, combined into one call with CallScript.\n\nRun on September 14, 2026, on an Apple M4 Max with four threads. DuckDB 1.5.5-r.5 and CallScript 0.1.0. One warm-up run and seven measured runs. Both execution methods returned identical results.\n\nTime includes SQL queries and reading results. It excludes file import, network, AI model time and cloud execution. This is neither an Excel comparison nor a performance guarantee for your operation.\n\nGrouping reduces calls at the agent interface from eight to one; all eight queries still run. This measures calls, not an eightfold speed increase.\n\n## The same technology. Applied to your way of working.\n\nIn one business, it helps track inventory. In another, it combines partner sales or prepares the next purchase.\n\nWe implement this technology as part of Siglata's work in your company. Our engineers connect systems, organize data and adapt routines alongside your team.\n\n## A 30-day pilot in your operation.\n\nWe implement a workflow and evaluate the results with your team. Each project is quoted according to the workflow and the scope of the pilot.\n\n[Benchmark results](/benchmarks/results.json) · [Reproduce the benchmark](/benchmarks/reproduce.md)\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Recursos para desenvolvedores da Siglata","description":"OpenAPI, MCP, descoberta OAuth e onboarding por link de acesso para agentes que integram com a Siglata.","url":"https://www.siglata.com/for-agents","inLanguage":"pt-BR","text":"# Recursos para desenvolvedores da Siglata\n\nEsta página é o índice das interfaces públicas da Siglata para máquinas. Não há painel de chaves de API nem etapa de vendas. Uma pessoa entra com um link de acesso. Um agente registra um cliente OAuth e conclui o fluxo de authorization code.\n\n## Comece sem credenciais\n\n- OpenAPI: https://www.siglata.com/api/openapi.json (também /openapi.json)\n- Saúde: GET https://www.siglata.com/api\n- Guia do agente: https://www.siglata.com/llms.txt\n- Docs: https://www.siglata.com/docs\n- Agentes no navegador (WebMCP, Chrome 149+): este site registra as ferramentas open_app, open_docs, open_developer_resources, list_pages e get_page via document.modelContext\n\n## Autenticar\n\nPessoas abrem https://www.siglata.com/app/sign-in e seguem o e-mail com link de acesso. Isso cria uma organização gratuita com cota de 10 GiB.\n\nAgentes registram em POST /auth/oauth2/register (registro dinâmico sem autenticação) e autorizam em https://www.siglata.com/v1/mcp.\n\n## Chame o produto\n\nPOST https://www.siglata.com/v1/mcp (Streamable HTTP). Chamadas sem autenticação retornam 401 com WWW-Authenticate. tools/list retorna exatamente duas ferramentas, execute e search. Operações de gestão rodam como funções CallScript dentro de um script execute. Os bytes de arquivo trafegam em caminhos autenticados PUT /v1/mcp/uploads/{uploadId}/parts/{partNumber} e GET /v1/mcp/files/{fileId}/download. Hub de instalação para pessoas: https://www.siglata.com/docs/agents/connect (Cursor e Codex comprovados na v1; ChatGPT Desktop, Claude Desktop e VS Code listados como instaláveis / compatíveis com a especificação). Esta página é apenas o índice voltado a máquinas.\n\nBusca pública com NLWeb: https://www.siglata.com/docs/nlweb. Consulte o site e a documentação em POST /ask; os resultados incluem as fontes. Não exige autenticação e não acessa arquivos de organizações."},{"@type":"WebPage","name":"Como trabalhamos · Siglata","description":"Engenheiros que adaptam a tecnologia à sua empresa. Entenda como funciona o piloto de 30 dias da Siglata.","url":"https://www.siglata.com/how-we-work","inLanguage":"pt-BR","text":"# A tecnologia se adapta ao seu negócio.\n\nSeus processos têm uma história. Nossos engenheiros entram na operação para entendê-la e colocar a automação para funcionar junto da sua equipe.\n\nO ponto de partida é o trabalho que sua equipe já faz todos os dias.\n\n## Começamos por um processo. Melhoramos junto com você.\n\nUm piloto de 30 dias dá um começo concreto: escolher o problema, trabalhar com dados reais e avaliar o resultado na operação.\n\n### Escolher o trabalho certo.\n\nSua equipe mostra o processo, os sistemas e os pontos que consomem tempo. Juntos, definimos o escopo e como avaliar a melhoria.\n\nUm processo, um responsável e um resultado esperado.\n\n### Colocar a tecnologia em uso.\n\nNossos engenheiros conectam os dados, adaptam as automações e testam as exceções com sua equipe, usando situações da operação.\n\nUma rotina funcionando com os dados da sua empresa.\n\n### Acompanhar o trabalho real.\n\nSua equipe usa os resultados e aponta o que precisa mudar. Ajustamos o processo e avaliamos juntos o que vale ampliar depois do piloto.\n\nO resultado observado e o retorno de quem usa a rotina.\n\n## Do estoque à próxima compra.\n\nO estoque está no ERP. As vendas chegam em outro relatório. Toda semana, alguém cruza os arquivos para descobrir o que precisa repor.\n\nA Siglata reúne os dados, compara o ritmo de vendas e prepara uma sugestão de reposição. Sua equipe revisa as quantidades e decide o que comprar.\n\n## Preservar o que funciona. Resolver o que toma tempo.\n\nA implantação parte dos seus sistemas e do conhecimento da sua equipe. A tecnologia entra onde o trabalho precisa de ajuda.\n\n### Os sistemas continuam.\n\nExtraímos os dados dos sistemas que sua empresa já usa, inclusive quando não existe uma integração disponível.\n\n### Sua equipe acompanha.\n\nQuem conhece a operação define as regras, testa as exceções e confere os resultados junto com nossos engenheiros.\n\n### Você define as decisões.\n\nSua equipe define o que pode rodar sozinho e o que precisa passar por revisão antes de seguir para a próxima etapa.\n\n## Trabalho que cabe em linhas e colunas.\n\nVendas, estoque, compras, cadastros e relatórios. Automatizamos rotinas baseadas em planilhas ou que podem ser organizadas em tabelas.\n\n### O que não fazemos\n\n- Automação de máquinas e equipamentos\n\n- Design e criação de conteúdo\n\n- Produção audiovisual\n\n## Um piloto de 30 dias na sua operação.\n\nImplementamos um processo e avaliamos o resultado com sua equipe. Cada projeto é orçado conforme o processo e o escopo do piloto.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Siglata · IA aplicada à sua operação","description":"Conectamos seus sistemas e automatizamos o trabalho com planilhas. Nossos engenheiros cuidam da implantação junto com sua equipe.","url":"https://www.siglata.com/","inLanguage":"pt-BR","text":"# IA aplicada à sua operação.\n\nConectamos seus sistemas e automatizamos o trabalho com planilhas. Nossos engenheiros cuidam da implantação junto com a sua equipe.\n\n## Sua operação já vive em planilhas.\n\nVendas, estoque e compras passam por linhas e colunas todos os dias. Conectamos os dados dos seus sistemas e colocamos agentes para trabalhar com eles, junto da sua equipe.\n\n### Conecte seus sistemas.\n\nReunimos os dados dos sistemas que você já usa, mesmo quando não existe uma integração disponível.\n\n### Automatize as planilhas.\n\nCruzamos e conferimos suas planilhas para transformar dados espalhados em resultados prontos para revisar.\n\n### Trabalhe com nosso time.\n\nAdaptamos a tecnologia à sua operação e acompanhamos a implantação com quem conhece o seu negócio.\n\n## Onde o trabalho acontece.\n\nVendas, estoque e compras. Cada empresa tem seu jeito de fazer.\n\n### Mais clareza para decidir.\n\nVendas por produto, loja e período.\n\n### Saiba o que precisa repor.\n\nPedidos, estoque e acompanhamento.\n\n### Veja o que mais vende.\n\nCruze os relatórios do ERP e dos parceiros para comparar vendas por produto, canal e período.\n\n### Saiba o que precisa repor.\n\nCompare o estoque com as vendas recentes e revise as reposições antes de faltar produto.\n\n### Prepare a próxima compra.\n\nReúna o que precisa repor e prepare uma sugestão de compra para a sua equipe revisar.\n\n## Dos arquivos ao próximo passo.\n\nUm exemplo de reposição de estoque: cruzar o que está disponível com o que está vendendo e preparar a próxima compra.\n\n### Continue com os sistemas que você já usa.\n\nA Siglata reúne o estoque do ERP, as vendas e o cadastro de produtos para acompanhar a operação.\n\n| Arquivo       | Origem   | Registros |\n| ------------- | -------- | --------- |\n| Estoque.xlsx  | ERP      | 4         |\n| Vendas.csv    | Vendas   | 4         |\n| Produtos.xlsx | Cadastro | 4         |\n\nUma tecnologia que trabalha com os agentes de IA que você já usa.\n\n- Codex\n\n- Hermes Agent\n\n- Grok Bot\n\n## Dentro do seu negócio. Ao lado da sua equipe.\n\nCada empresa tem um jeito de trabalhar. Nossos engenheiros entram na operação para entender os processos e colocar a automação para funcionar com quem conhece o negócio.\n\n## Trabalho que cabe em linhas e colunas.\n\nVendas, estoque, compras, cadastros e relatórios. Automatizamos rotinas baseadas em planilhas ou que podem ser organizadas em tabelas.\n\n### O que não fazemos\n\n- Automação de máquinas e equipamentos\n\n- Design e criação de conteúdo\n\n- Produção audiovisual\n\n## Seu negócio merece o seu tempo.\n\nQuem toca uma empresa deveria passar mais tempo com clientes, com a equipe e com as decisões do negócio. Menos tempo copiando dados de um lugar para outro.\n\nCriamos tecnologia para tirar esse trabalho do caminho. E trabalhamos dentro de cada operação para aplicá-la, respeitando o conhecimento de quem já faz tudo acontecer.\n\n## Um piloto de 30 dias na sua operação.\n\nImplementamos um processo e avaliamos o resultado com sua equipe. Cada projeto é orçado conforme o processo e o escopo do piloto.\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"WebPage","name":"Preços e escopo do piloto | Siglata","description":"Cada projeto é orçado conforme o processo e o escopo do piloto.","url":"https://www.siglata.com/how-we-work#piloto","inLanguage":"pt-BR","text":"# Preços e escopo do piloto\n\nCada projeto é orçado conforme o processo e o escopo do piloto.\n\nComeçamos com um piloto de 30 dias na sua operação. Definimos um processo, implementamos a rotina com sua equipe e avaliamos o resultado.\n\n[Veja como trabalhamos](/how-we-work#piloto) · [Fale no WhatsApp](https://wa.me/5563992943367)"},{"@type":"WebPage","name":"Política de privacidade","description":"A Siglata armazena o mínimo necessário para operar organizações e arquivos. Esta página é a descrição pública desses dados. Ela não substitui o contrato de um cliente específico e não se aplica ao conteúdo que você guarda em arquivos. Os bytes dos arquivos pertencem à organização que os enviou.","url":"https://www.siglata.com/privacy","inLanguage":"pt-BR","text":"# Política de privacidade\n\nA Siglata armazena o mínimo necessário para operar organizações e arquivos. O conteúdo dos arquivos pertence à organização que os enviou.\n\n## Dados da conta\n\nO acesso usa um endereço de e-mail e um link de uso único. Armazenamos esse endereço, registros de sessão e a participação em organizações. Não armazenamos senha. A preferência de idioma pode ser registrada em um cookie chamado `siglata-locale`.\n\n## Dados de organizações e arquivos\n\nNomes, tamanhos, tipos de mídia, pastas, visibilidade e permissões de acesso dos arquivos ficam associados à organização. Arquivos na lixeira permanecem disponíveis até o fim do prazo de recuperação de 30 dias. Arquivos ativos e na lixeira contam para a cota de armazenamento da organização.\n\n## Acesso por agentes\n\nClientes MCP recebem uma autorização OAuth vinculada a uma organização e a uma lista de escopos. Encerrar a sessão ou remover o membro encerra o acesso. Não emitimos chaves de API de longa duração sem escopos.\n\nPara exportar ou excluir uma conta, escreva para support@mail.siglata.com usando o endereço da conta. Relate problemas de segurança a security@mail.siglata.com."},{"@type":"WebPage","name":"Reposição de estoque com base nas vendas · Siglata","description":"Cruze o estoque com as vendas e prepare uma sugestão de compra que sua equipe consegue conferir.","url":"https://www.siglata.com/reposicao","inLanguage":"pt-BR","text":"# Reponha com base no que vende.\n\nCruze o estoque com as vendas e prepare uma sugestão de compra que sua equipe consegue conferir.\n\nA partir dos sistemas que você já usa. Implantado com a sua equipe.\n\n## O que merece atenção antes da próxima compra.\n\nExemplo ilustrativo · Últimos 7 dias. O mesmo estoque pode durar três dias ou três semanas. O ritmo de vendas muda a decisão.\n\n| Produto       | Estoque | Vendas / 7 dias | Cobertura | Próximo passo     |\n| ------------- | ------: | --------------: | --------: | ----------------- |\n| Café 500 g    |  18 un. |          42 un. |    3 dias | Revisar reposição |\n| Azeite 500 ml |  36 un. |          28 un. |    9 dias | Revisar reposição |\n| Arroz 5 kg    |  70 un. |          35 un. |   14 dias | Acompanhar        |\n| Açúcar 1 kg   |  40 un. |          14 un. |   20 dias | Acompanhar        |\n\nCobertura = estoque disponível ÷ média diária de vendas.\n\nNeste exemplo, itens com menos de 10 dias de cobertura vão para revisão. A regra real é definida com sua equipe.\n\nA lista explica o sinal. Sua equipe decide a compra. Cobertura é uma estimativa com base no período observado. Prazo do fornecedor, pedidos em aberto e sazonalidade entram na revisão antes de definir quantidades.\n\n## A conta é só uma parte da reposição.\n\nDefinimos os critérios com quem compra, vende e acompanha o estoque todos os dias.\n\n### Compare o que é comparável.\n\nProduto, loja, unidade de medida e período precisam estar alinhados antes de cruzar os arquivos.\n\n### Considere o que já está a caminho.\n\nPrazo do fornecedor, lote mínimo e pedidos em aberto ajudam a definir quanto e quando repor.\n\n### Separe o que precisa de conferência.\n\nCadastro divergente, saldo desatualizado ou venda fora do padrão ficam visíveis para revisão.\n\n### Mantenha a compra com sua equipe.\n\nA sugestão reúne os dados e o motivo de cada item. Quem conhece a operação valida o próximo passo.\n\n## Antes de começar.\n\n### Preciso trocar meu ERP?\n\nO trabalho começa com os sistemas e arquivos que você já usa. Na conversa inicial, avaliamos como obter os dados e manter a rotina atualizada.\n\n### A Siglata faz o pedido de compra sozinha?\n\nNesta rotina, o resultado é uma sugestão para revisão. Qualquer etapa automática adicional precisa ser definida no escopo com a sua equipe.\n\n### E se meus cadastros estiverem diferentes?\n\nA implantação inclui conferir identificadores, unidades e períodos. Divergências precisam ser resolvidas ou sinalizadas antes de orientar uma compra.\n\n### Como funciona o piloto?\n\nEscolhemos um processo e um recorte da operação para um piloto de 30 dias. Escopo, critérios de avaliação e orçamento são definidos antes de começar.\n\n[Converse sobre sua reposição](https://wa.me/5563992943367)"},{"@type":"WebPage","name":"Tecnologia de planilhas para agentes · Siglata","description":"DuckDB, CallScript e processamento na nuvem. Conheça a tecnologia de planilhas que a Siglata implanta na sua empresa.","url":"https://www.siglata.com/spreadsheets","inLanguage":"pt-BR","text":"# O Excel foi feito para pessoas. Nossa tecnologia, para agentes.\n\nO Excel é um ótimo editor. Mas um agente precisa de outra forma de trabalhar: consultar tabelas, cruzar dados e executar etapas inteiras sem editar célula por célula.\n\n## Como estão as vendas de cada loja?\n\nO agente consulta a tabela de vendas, cruza com as metas e devolve o resumo para revisão.\n\n| Loja    | Vendas    | Meta      |\n| ------- | --------- | --------- |\n| Centro  | R$ 84.200 | R$ 80.000 |\n| Estação | R$ 62.400 | R$ 60.000 |\n| Jardins | R$ 71.800 | R$ 75.000 |\n\n## Dados de planilha. Ferramentas para agentes.\n\nMuitos negócios funcionam em linhas e colunas. Nossa tecnologia preserva essa estrutura e dá aos agentes acesso direto aos dados e às operações de que precisam.\n\n### Processar o conjunto inteiro.\n\nConsultas SQL filtram, agrupam e cruzam tabelas inteiras. O agente trabalha com os dados sem percorrer cada célula da interface.\n\n### Reunir etapas em uma chamada.\n\nO agente organiza várias operações em um plano. Os resultados passam de uma etapa à outra sem voltar ao modelo a cada chamada.\n\n### Deixar o trabalho pesado fora.\n\nO processamento acontece na nuvem, sob o controle dos agentes. Seu computador fica com a consulta e a revisão dos resultados.\n\n## O que medimos na prática.\n\nTeste técnico local com dados gerados: vendas, produtos e lojas. Os números abaixo medem o motor de consulta e a organização das chamadas.\n\n### de linhas de vendas\n\nDados de 1.000 produtos e 50 lojas, já carregados em memória.\n\n### para oito consultas\n\nMediana de sete execuções, com filtros, totais e cruzamento de tabelas.\n\n### chamadas feitas pelo agente\n\nAs mesmas oito operações, reunidas em uma chamada com CallScript.\n\nExecução em 14/09/2026, em um Apple M4 Max, com quatro threads. DuckDB 1.5.5-r.5 e CallScript 0.1.0. Uma rodada de aquecimento e sete rodadas medidas. Resultados das duas formas de execução conferidos e iguais.\n\nO tempo inclui as consultas SQL e a leitura dos resultados. Não inclui importação dos arquivos, rede, tempo do modelo de IA nem execução em nuvem. Não é uma comparação com Excel nem uma garantia de desempenho na sua operação.\n\nO agrupamento reduz de oito para uma as chamadas na interface do agente; as oito consultas continuam sendo executadas. Esse número mede chamadas, não um ganho de velocidade de oito vezes.\n\n## A mesma tecnologia. Aplicada ao seu jeito de trabalhar.\n\nEm uma empresa, ela ajuda a acompanhar o estoque. Em outra, cruza as vendas dos parceiros ou prepara a próxima compra.\n\nImplantamos essa tecnologia como parte do trabalho da Siglata na sua empresa. Nossos engenheiros conectam os sistemas, organizam os dados e adaptam as rotinas com a sua equipe.\n\n## Um piloto de 30 dias na sua operação.\n\nImplementamos um processo e avaliamos o resultado com sua equipe. Cada projeto é orçado conforme o processo e o escopo do piloto.\n\n[Benchmark results](/benchmarks/results.json) · [Reproduce the benchmark](/benchmarks/reproduce.md)\n\n[WhatsApp](https://wa.me/5563992943367) · [angelica@siglata.com](mailto:angelica@siglata.com)\n\nFranca, São Paulo, Brasil."},{"@type":"TechArticle","name":"Conectar","description":"Escolha o app e autorize o acesso ao Siglata.","url":"https://www.siglata.com/docs/agents/connect","inLanguage":"pt-BR","text":"Conecte o Siglata ao app de IA que você já usa. Depois disso, o agente pode trabalhar com os arquivos da sua organização sob as mesmas funções e permissões do app Siglata.\n\nComece pelo [hub de instalação com detecção de sistema operacional](/docs/agents/install) se quiser que a página escolha Bash ou PowerShell para você.\n\nEstas páginas são apenas guias de instalação. Elas não substituem o site de marketing nem a referência de capacidades do MCP.\n\n## Antes de começar\n\n1. Você consegue abrir o e-mail neste dispositivo (o Siglata autentica com link mágico).\n2. Você tem um dos apps da tabela abaixo instalado.\n3. Você sabe qual organização do Siglata o agente deve usar (você escolhe no login).\n\nNão há chave de API para colar. O cliente abre o navegador, você entra, você aprova o acesso.\n\n## Escolha seu app\n\n| App | Status | Guia |\n| :-- | :-- | :-- |\n| Cursor | Comprovado (v1) | [Conectar Cursor](/docs/agents/install/cursor) |\n| Codex | Comprovado (v1) | [Conectar Codex](/docs/agents/install/codex) |\n| ChatGPT Desktop | Instalável / compatível com a especificação | [Conectar ChatGPT Desktop](/docs/agents/install/chatgpt-desktop) |\n| Claude Desktop | Instalável / compatível com a especificação | [Conectar Claude Desktop](/docs/agents/install/claude-desktop) |\n| VS Code (Copilot) | Instalável / compatível com a especificação | [Conectar VS Code](/docs/agents/install/vs-code) |\n\n**Comprovado (v1)** significa que Cursor e Codex são os clientes verificados nesta versão. **Instalável / compatível com a especificação** significa que o mesmo endpoint MCP funciona nesses apps quando há suporte a Streamable HTTP remoto e OAuth. Os passos podem variar um pouco conforme a versão do app.\n\n## Fatos compartilhados\n\n- Endpoint MCP: `https://www.siglata.com/v1/mcp`\n- Uma conexão vincula-se a uma organização. Para outra organização, autorize outra conexão.\n- O servidor expõe duas ferramentas, `execute` e `search`. O trabalho de gerenciamento roda dentro de scripts `execute`.\n\n## O que o agente pode fazer\n\nEm linguagem simples, um agente conectado pode listar e organizar arquivos e pastas, enviar e baixar (dentro dos seus escopos) e ajudar com membros e convites quando a sua função permitir.\n\nO detalhe completo está em [MCP](/docs/agents/mcp).\n\n## Para agentes\n\n- Hub humano: `https://www.siglata.com/docs/agents/connect`\n- Hub de instalação: `https://www.siglata.com/docs/agents/install`\n- Endpoint MCP: `https://www.siglata.com/v1/mcp` (Streamable HTTP, OAuth)\n- `tools/list` retorna apenas `execute` e `search`\n- Chame `search` para descobrir as operações CallScript da concessão\n- Chame operações apenas dentro de scripts `execute`\n- Vínculo de organização: `principal_get` dentro de `execute` (retorna `organizationId`, `userId`, `role`, `scopes`). Não existe ferramenta MCP separada chamada `context`. Combine com `organization_get` para nome ou slug.\n- Índice para máquinas: `https://www.siglata.com/for-agents` e `https://www.siglata.com/llms.txt`"},{"@type":"TechArticle","name":"Agentes","description":"Conecte um app de IA ao Siglata e veja o que o MCP permite.","url":"https://www.siglata.com/docs/agents/","inLanguage":"pt-BR","text":"Conecte o agente que você já usa. Depois disso, ele trabalha com os arquivos da organização sob as mesmas funções e permissões do app Siglata.\n\n| Página | Resultado |\n| :-- | :-- |\n| [Conectar](/docs/agents/connect) | Escolha o app e autorize o acesso. |\n| [MCP](/docs/agents/mcp) | Veja ferramentas, operações e escopos. |\n| [Instalar](/docs/agents/install) | Copie os passos do seu sistema operacional e do app. |"},{"@type":"TechArticle","name":"Conectar o ChatGPT Work no desktop","description":"Conecte o ChatGPT Work no app desktop ao Siglata pelas configurações de MCP, usando a mesma configuração local de servidores do Codex.","url":"https://www.siglata.com/docs/agents/install/chatgpt-desktop","inLanguage":"pt-BR","text":"Este guia explica como conectar o ChatGPT Work ao Siglata no app desktop do ChatGPT. Este caminho é **instalável / compatível com a especificação** na v1 (Cursor e Codex são os clientes comprovados).\n\nO ChatGPT Desktop compartilha a configuração MCP com a CLI do Codex e a extensão de IDE (`~/.codex/config.toml`).\n\nO Work na web usa plugins em vez das configurações locais de MCP. Consulte o [guia de configuração de MCP da OpenAI](https://learn.chatgpt.com/docs/extend/mcp?surface=cli) para conferir os caminhos do desktop e da web.\n\n## Pré-requisitos\n\n- App desktop do ChatGPT instalado e atualizado, com acesso ao Work\n- Acesso ao e-mail que você usa no Siglata\n\n## Passos\n\n1. Abra **Settings**, depois **MCP servers**.\n2. Selecione **Add server**.\n3. Digite o nome `siglata`.\n4. Escolha **Streamable HTTP**.\n5. Cole a URL:\n\n```text\nhttps://www.siglata.com/v1/mcp\n```\n\n6. Salve e **Restart** quando o app pedir.\n7. Se o servidor mostrar **Authenticate**, conclua o OAuth. Entre com o link mágico, escolha a organização e aprove os escopos.\n8. No compositor, digite `/mcp` para confirmar a conexão.\n\n## Você terminou quando…\n\n- **siglata** aparece em MCP servers e está ativado\n- O OAuth concluiu\n- `/mcp` lista o Siglata\n- O agente pode usar `execute` e `search`\n\nExperimente: “Liste meus arquivos no Siglata.”\n\n## Solução de problemas\n\n- **Auth ou consentimento travado.** Selecione **Authenticate** de novo na linha do servidor. Conclua o link mágico no navegador aberto.\n- **Organização errada.** Remova o servidor, adicione de novo e escolha a organização correta.\n- **Servidor salvo sem uso.** Reinicie o app. Confirme Streamable HTTP (não STDIO) e a URL exata acima.\n- **Também usa Codex.** Esta configuração é compartilhada. Veja [Conectar Codex](/docs/agents/install/codex) para o caminho do plugin se quiser skills.\n\n## O que o agente pode fazer\n\nListar e organizar arquivos e pastas, enviar e baixar dentro dos seus escopos e ajudar com membros e convites quando a sua função permitir. Detalhes: [MCP](/docs/agents/mcp).\n\nVoltar para [Conectar](/docs/agents/connect).\n\n## Para agentes\n\n- UI: ChatGPT Desktop → Settings → MCP servers → Streamable HTTP → `https://www.siglata.com/v1/mcp`\n- Configuração compartilhada com Codex: `~/.codex/config.toml`\n- Ferramentas: apenas `execute` e `search`\n- Organização: `principal_get` dentro de `execute` (sem ferramenta `context`)\n- Hub: `https://www.siglata.com/docs/agents/connect`"},{"@type":"TechArticle","name":"Conectar Claude Desktop","description":"Adicione o Siglata como conector remoto no Claude Desktop, entre na sua conta e escolha sua organização.","url":"https://www.siglata.com/docs/agents/install/claude-desktop","inLanguage":"pt-BR","text":"Conecte o Claude Desktop ao Siglata por um conector remoto personalizado. Adicione a URL em **Personalizar > Conectores** e entre no Siglata. Este caminho é **instalável / compatível com a especificação** na v1 (Cursor e Codex são os clientes comprovados).\n\n## Pré-requisitos\n\n- Claude Desktop instalado (macOS ou Windows)\n- Acesso ao e-mail que você usa no Siglata\n\nSe você usa Claude Team ou Enterprise, peça a um proprietário para adicionar o Siglata em **Configurações da organização > Conectores**. O proprietário seleciona **Adicionar > Personalizado > Web** e usa a URL abaixo. Depois, cada membro conecta sua própria conta do Siglata.\n\n## Adicione o conector [#passos]\n\n1. Abra **Personalizar > Conectores** no Claude Desktop.\n2. Se o Siglata já estiver na lista, continue em **Conecte sua conta** abaixo.\n3. Em uma conta individual, selecione **+ > Adicionar conector personalizado**.\n4. Dê ao conector o nome `siglata` e informe esta URL:\n\n   ```text\n   https://www.siglata.com/v1/mcp\n   ```\n\n5. Selecione **Adicionar**.\n\n## Conecte sua conta\n\n1. Encontre **siglata** em **Personalizar > Conectores** e selecione **Conectar**.\n2. Entre no Siglata pelo link mágico recebido por e-mail, se necessário.\n3. Escolha a organização do Siglata que essa conexão pode acessar.\n4. Aprove as permissões solicitadas.\n5. Na conversa, abra **+ > Conectores** e ative **siglata**.\n\nO conector remoto é configurado pela sua conta do Claude. Consulte as [instruções da Anthropic para conectores remotos](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp) para conferir os requisitos da conta e do workspace.\n\n## Você terminou quando…\n\n- **siglata** aparece conectado em **Personalizar > Conectores**\n- O OAuth concluiu\n- O Claude pode chamar as ferramentas do Siglata (`execute` e `search`)\n\nExperimente: “Liste os arquivos da minha organização no Siglata.”\n\n## Solução de problemas\n\n- **O Siglata não aparece no seu workspace Team ou Enterprise.** Peça a um proprietário para adicionar o conector remoto. Depois, conecte sua conta.\n- **A janela de login fechou antes de terminar.** Selecione **Conectar** novamente em **Personalizar > Conectores**.\n- **Organização errada.** Desconecte o Siglata e conecte novamente. Escolha a organização correta durante a autorização.\n- **As ferramentas não aparecem na conversa.** Abra **+ > Conectores** e ative **siglata**.\n- **As chamadas falham com 401.** A autorização terminou porque a sessão foi revogada ou sua participação na organização mudou. Reconecte o Siglata para autorizar o acesso novamente.\n\n## O que o agente pode fazer\n\nListar e organizar arquivos e pastas, enviar e baixar dentro dos seus escopos e ajudar com membros e convites quando a sua função permitir. Detalhes: [MCP](/docs/agents/mcp).\n\nVoltar para [Conectar](/docs/agents/connect).\n\n## Para agentes\n\n- Adicione o conector remoto em **Personalizar > Conectores** e selecione **Conectar** para `siglata`.\n- URL do servidor: `https://www.siglata.com/v1/mcp`. O transporte é Streamable HTTP e a autorização usa OAuth 2.0.\n- Ferramentas: apenas `execute` e `search`\n- Organização: `principal_get` dentro de `execute` (sem ferramenta `context`)\n- Hub: `https://www.siglata.com/docs/agents/connect`"},{"@type":"TechArticle","name":"Conectar Codex","description":"Instale o plugin de agente do Siglata no Codex, ou adicione a URL MCP diretamente. Cliente comprovado na v1.","url":"https://www.siglata.com/docs/agents/install/codex","inLanguage":"pt-BR","text":"Conecte o Siglata ao [Codex](https://chatgpt.com/codex) (CLI, extensão de IDE ou modo Codex no ChatGPT desktop). O Codex é um cliente **comprovado (v1)**.\n\nPrefira o caminho do plugin. Ele instala skills e a conexão MCP juntos.\n\n## Pré-requisitos\n\n- Codex disponível (CLI, extensão de IDE ou ChatGPT desktop com Codex)\n- Acesso ao e-mail que você usa no Siglata\n\n## Passos (plugin, recomendado)\n\nExecute estes comandos. Não é necessário npm.\n\n```sh\ncodex plugin marketplace add siglata/agent-plugins\ncodex plugin add siglata@siglata-agent-plugins\n```\n\n1. Inicie uma **nova** sessão do Codex depois da instalação.\n2. Quando solicitado, conclua o login do Siglata no navegador. Escolha a organização e aprove os escopos.\n3. Peça ao Codex para usar **siglata** em tarefas de arquivos ou organização.\n\nDetalhes do pacote estão em [siglata/agent-plugins](https://github.com/siglata/agent-plugins).\n\n## Passos (somente URL MCP)\n\nSe quiser o servidor MCP sem as skills do plugin:\n\n```sh\ncodex mcp add siglata --url https://www.siglata.com/v1/mcp\n```\n\nEm seguida execute `codex mcp login siglata` se o OAuth não iniciar sozinho. No TUI do Codex, digite `/mcp` para listar servidores.\n\nO ChatGPT Desktop, a CLI do Codex e a extensão de IDE compartilham `~/.codex/config.toml`. Configurar uma vez cobre essas superfícies.\n\n## Você terminou quando…\n\n- O plugin ou o servidor MCP **siglata** está ativado\n- O OAuth concluiu\n- `/mcp` (ou a lista de servidores MCP) mostra o Siglata conectado\n- O agente pode chamar `execute` e `search`\n\nExperimente: “Use o siglata para listar os arquivos da minha organização.”\n\n## Solução de problemas\n\n- **Auth ou consentimento travado.** Execute `codex mcp login siglata` de novo. Conclua o link mágico na mesma sessão do navegador quando possível.\n- **Organização errada.** Revogue ou remova o servidor, adicione de novo e escolha a organização correta na autorização.\n- **Plugin instalado sem ferramentas.** Inicie uma nova sessão. Confirme que o plugin e o MCP estão ativados.\n- **Configuração compartilhada.** Uma mudança no ChatGPT Desktop também afeta a CLI do Codex (e o inverso).\n\n## O que o agente pode fazer\n\nListar e organizar arquivos e pastas, enviar e baixar dentro dos seus escopos e ajudar com membros e convites quando a sua função permitir. Detalhes: [MCP](/docs/agents/mcp).\n\nVeja também [Conectar ChatGPT Desktop](/docs/agents/install/chatgpt-desktop) se usar essa UI na mesma configuração compartilhada.\n\nVoltar para [Conectar](/docs/agents/connect).\n\n## Para agentes\n\nPreferido:\n\n```sh\ncodex plugin marketplace add siglata/agent-plugins\ncodex plugin add siglata@siglata-agent-plugins\n```\n\nSomente MCP:\n\n```sh\ncodex mcp add siglata --url https://www.siglata.com/v1/mcp\n```\n\n- Ferramentas: apenas `execute` e `search`\n- Organização: `principal_get` dentro de `execute` (sem ferramenta `context`)\n- Hub: `https://www.siglata.com/docs/agents/connect`"},{"@type":"TechArticle","name":"Conectar Cursor","description":"Adicione o servidor MCP do Siglata ao Cursor com um JSON curto e login OAuth. Cliente comprovado na v1.","url":"https://www.siglata.com/docs/agents/install/cursor","inLanguage":"pt-BR","text":"Conecte o Siglata ao [Cursor](https://cursor.com) para o Agent usar os arquivos da sua organização. O Cursor é um cliente **comprovado (v1)**.\n\n## Pré-requisitos\n\n- Cursor instalado (desktop)\n- Acesso ao e-mail que você usa no Siglata\n\n## Passos\n\n1. Crie o arquivo do projeto `.cursor/mcp.json`, ou o arquivo global `~/.cursor/mcp.json`.\n2. Cole esta configuração (mescle em um objeto `mcpServers` existente se já houver um):\n\n```json title=\".cursor/mcp.json\"\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\n3. Salve o arquivo.\n4. Abra **Customize** (ou **Settings → MCP**) e confirme que **siglata** aparece e está ativado.\n5. Quando o Cursor pedir autenticação, conclua o fluxo no navegador. Entre com o link mágico, escolha a organização e aprove os escopos.\n\nVocê também pode adicionar um servidor MCP remoto na UI do Cursor e colar a mesma URL.\n\n## Você terminou quando…\n\n- **siglata** aparece conectado nas configurações MCP do Cursor\n- O OAuth concluiu sem erro\n- No chat, o agente pode usar as ferramentas do Siglata (você deve ver `execute` e `search`)\n\nExperimente: “Use o Siglata para listar os arquivos da minha organização.”\n\n## Solução de problemas\n\n- **Auth ou consentimento travado.** Cancele e inicie o OAuth de novo a partir da entrada do servidor MCP. Use o mesmo perfil do navegador ao abrir o e-mail do link mágico.\n- **Organização errada.** Cada concessão vincula-se a uma organização. Remova a conexão e autorize de novo, escolhendo a organização correta.\n- **Ferramentas ausentes.** Confirme que o servidor está ativado. Abra **Output → MCP Logs**. Reinicie o Cursor depois de editar o `mcp.json`.\n- **Pedidos de aprovação.** O Cursor pode pedir confirmação antes de cada chamada. Aprove `execute` e `search` quando confiar na solicitação.\n\n## O que o agente pode fazer\n\nListar e organizar arquivos e pastas, enviar e baixar dentro dos seus escopos e ajudar com membros e convites quando a sua função permitir. Detalhes: [MCP](/docs/agents/mcp).\n\nVoltar para [Conectar](/docs/agents/connect).\n\n## Para agentes\n\n```json\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\n- Arquivos: projeto `.cursor/mcp.json` ou global `~/.cursor/mcp.json`\n- Ferramentas: apenas `execute` e `search`\n- Organização: `principal_get` dentro de `execute` (sem ferramenta `context`)\n- Hub: `https://www.siglata.com/docs/agents/connect`"},{"@type":"TechArticle","name":"Instalar","description":"Copie os passos do seu sistema operacional e do app.","url":"https://www.siglata.com/docs/agents/install/","inLanguage":"pt-BR","text":"Use esta página quando quiser o caminho mais direto de “tenho um agente” para “ele consegue usar meu espaço de trabalho no Siglata”. A página detecta seu sistema operacional no navegador e mostra Bash para macOS e Linux ou PowerShell para Windows. Você pode trocar a opção manualmente.\n\nPara o Claude Desktop, siga o [guia do conector remoto](/docs/agents/install/claude-desktop). A opção Claude abaixo exibe as instruções do conector. Para o ChatGPT Work, estes comandos locais se aplicam ao app desktop. [O Work na web usa plugins](https://learn.chatgpt.com/docs/extend/mcp?surface=cli).\n\n<div data-siglata-install-picker data-locale=\"pt-BR\" style=\"border: 1px solid var(--blume-border); border-radius: 8px; padding: 1rem; margin: 1.5rem 0;\">\n  <p style=\"margin: 0 0 0.75rem;\"><strong>Sistema operacional detectado:</strong> <span data-os-label>Verificando...</span></p>\n  <div style=\"display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem;\">\n    <button type=\"button\" data-os-choice=\"mac\" style=\"border: 1px solid var(--blume-border); border-radius: 6px; padding: 0.4rem 0.65rem;\">macOS / Linux</button>\n    <button type=\"button\" data-os-choice=\"windows\" style=\"border: 1px solid var(--blume-border); border-radius: 6px; padding: 0.4rem 0.65rem;\">Windows</button>\n  </div>\n  <div data-os-panel=\"mac\">\n\n```bash\n#!/usr/bin/env bash\n# Escolha um: codex, cursor, claude, vscode, chatgpt\nAGENT=\"${AGENT:-codex}\"\n\ncase \"$AGENT\" in\n  codex)\n    codex plugin marketplace add siglata/agent-plugins\n    codex plugin add siglata@siglata-agent-plugins\n    ;;\n  cursor)\n    mkdir -p .cursor\n    cat > .cursor/mcp.json <<'JSON'\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\nJSON\n    ;;\n  claude)\n    printf '%s\\n' \\\n      'No Claude Desktop, abra Personalizar > Conectores.' \\\n      'Adicione um conector personalizado chamado siglata com esta URL:' \\\n      'https://www.siglata.com/v1/mcp' \\\n      'Conecte o siglata, entre na sua conta, escolha a organização e aprove o acesso.' \\\n      'No Team ou Enterprise, peça a um proprietário para adicionar o conector primeiro.'\n    ;;\n  vscode)\n    mkdir -p .vscode\n    cat > .vscode/mcp.json <<'JSON'\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\nJSON\n    ;;\n  chatgpt)\n    codex mcp add siglata --url https://www.siglata.com/v1/mcp\n    codex mcp login siglata\n    ;;\nesac\n```\n\n  </div>\n  <div data-os-panel=\"windows\" hidden>\n\n```powershell\n# Escolha um: codex, cursor, claude, vscode, chatgpt\n$Agent = if ($env:AGENT) { $env:AGENT } else { \"codex\" }\n\nswitch ($Agent) {\n  \"codex\" {\n    codex plugin marketplace add siglata/agent-plugins\n    codex plugin add siglata@siglata-agent-plugins\n  }\n  \"cursor\" {\n    New-Item -ItemType Directory -Force -Path \".cursor\" | Out-Null\n    @'\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n'@ | Set-Content -Encoding UTF8 \".cursor\\mcp.json\"\n  }\n  \"claude\" {\n    Write-Output \"No Claude Desktop, abra Personalizar > Conectores.\"\n    Write-Output \"Adicione um conector personalizado chamado siglata com esta URL:\"\n    Write-Output \"https://www.siglata.com/v1/mcp\"\n    Write-Output \"Conecte o siglata, entre na sua conta, escolha a organização e aprove o acesso.\"\n    Write-Output \"No Team ou Enterprise, peça a um proprietário para adicionar o conector primeiro.\"\n  }\n  \"vscode\" {\n    New-Item -ItemType Directory -Force -Path \".vscode\" | Out-Null\n    @'\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n'@ | Set-Content -Encoding UTF8 \".vscode\\mcp.json\"\n  }\n  \"chatgpt\" {\n    codex mcp add siglata --url https://www.siglata.com/v1/mcp\n    codex mcp login siglata\n  }\n}\n```\n\n  </div>\n</div>\n\n<script>\n(() => {\n  const root = document.querySelector(\"[data-siglata-install-picker]\");\n  if (!(root instanceof HTMLElement)) {\n    return;\n  }\n\n  const labels = {\n    mac: \"macOS / Linux\",\n    windows: \"Windows\",\n  };\n\n  const label = root.querySelector(\"[data-os-label]\");\n  const choices = Array.from(root.querySelectorAll(\"[data-os-choice]\"));\n  const panels = Array.from(root.querySelectorAll(\"[data-os-panel]\"));\n  const platform = `${navigator.userAgent} ${navigator.platform}`.toLowerCase();\n\n  const setOs = (os) => {\n    if (label !== null) {\n      label.textContent = labels[os] ?? labels.mac;\n    }\n\n    for (const panel of panels) {\n      panel.hidden = panel.getAttribute(\"data-os-panel\") !== os;\n    }\n\n    for (const choice of choices) {\n      const selected = choice.getAttribute(\"data-os-choice\") === os;\n      choice.setAttribute(\"aria-pressed\", selected ? \"true\" : \"false\");\n    }\n  };\n\n  for (const choice of choices) {\n    choice.addEventListener(\"click\", () => {\n      const os = choice.getAttribute(\"data-os-choice\");\n\n      if (os === \"mac\" || os === \"windows\") {\n        setOs(os);\n      }\n    });\n  }\n\n  setOs(platform.includes(\"windows\") || platform.includes(\"win32\") ? \"windows\" : \"mac\");\n})();\n</script>\n\n## Escolha seu agente [#agents]\n\n| Agente | Melhor caminho | Status | Observações |\n| :-- | :-- | :-- | :-- |\n| Codex | Comandos do plugin | Comprovado (v1) | Instala as skills do Siglata e o MCP juntos. Reinicie a sessão do Codex depois. |\n| ChatGPT Work no desktop | Configurações ou config compartilhada do Codex | Instalável / compatível com a especificação | Usa a mesma entrada em `~/.codex/config.toml` do Codex. |\n| Cursor | `.cursor/mcp.json` ou configurações MCP | Comprovado (v1) | Use config do projeto para um repositório ou global para todos. |\n| Claude Desktop | Conector remoto personalizado | Instalável / compatível com a especificação | Adicione o Siglata em Personalizar > Conectores e conecte sua conta. |\n| VS Code | Command Palette ou `.vscode/mcp.json` | Instalável / compatível com a especificação | Use o Copilot Chat em modo Agent e ative o servidor no seletor de ferramentas. |\n\n## Depois do script [#after]\n\n1. Inicie ou reinicie o agente.\n2. Comece o login do Siglata quando o app oferecer.\n3. Abra o link mágico no seu e-mail.\n4. Escolha a organização que o agente pode acessar.\n5. Aprove as permissões solicitadas.\n\nVocê terminou quando o agente lista exatamente duas ferramentas, `execute` e `search`, e consegue listar arquivos da sua organização no Siglata.\n\n## Guias detalhados [#guides]\n\n- [Conectar Codex](/docs/agents/install/codex)\n- [Conectar o ChatGPT Work no desktop](/docs/agents/install/chatgpt-desktop)\n- [Conectar Cursor](/docs/agents/install/cursor)\n- [Conectar Claude Desktop](/docs/agents/install/claude-desktop)\n- [Conectar VS Code](/docs/agents/install/vs-code)"},{"@type":"TechArticle","name":"Conectar VS Code","description":"Adicione o servidor MCP HTTP do Siglata no VS Code Copilot. Instalável e compatível com a especificação.","url":"https://www.siglata.com/docs/agents/install/vs-code","inLanguage":"pt-BR","text":"Conecte o Siglata ao Visual Studio Code com GitHub Copilot Chat. Este caminho é **instalável / compatível com a especificação** na v1 (Cursor e Codex são os clientes comprovados).\n\n## Pré-requisitos\n\n- VS Code com Copilot Chat / recursos de agente que suportam MCP\n- Acesso ao e-mail que você usa no Siglata\n\n## Passos\n\n1. Abra a Command Palette (**Ctrl+Shift+P** ou **Cmd+Shift+P**).\n2. Execute **MCP: Add Server**.\n3. Escolha **HTTP**.\n4. Informe:\n\n```text\nhttps://www.siglata.com/v1/mcp\n```\n\n5. Escolha **User** (todos os workspaces) ou **Workspace** (só este projeto).\n6. Confie no servidor quando o VS Code pedir.\n7. Conclua o OAuth no navegador. Entre com o link mágico, escolha a organização e aprove os escopos.\n\n### Ou edite o `mcp.json`\n\nArquivo do workspace: `.vscode/mcp.json`. Perfil do usuário: execute **MCP: Open User Configuration**.\n\n```json title=\".vscode/mcp.json\"\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\nDepois execute **MCP: List Servers** e inicie **siglata** se não estiver em execução.\n\n## Você terminou quando…\n\n- **siglata** aparece na lista de servidores MCP e está em execução\n- O OAuth concluiu\n- O Copilot Chat pode usar as ferramentas do Siglata (`execute` e `search`)\n\nExperimente: “Use o Siglata para listar os arquivos da minha organização.”\n\n## Solução de problemas\n\n- **Auth ou consentimento travado.** Em **MCP: List Servers**, pare e inicie o servidor, depois autentique de novo.\n- **Diálogo de confiança bloqueou o start.** Execute **MCP: Reset Trust** só se pretende reaprovar, depois inicie o servidor de novo.\n- **Organização errada.** Remova a configuração, adicione de novo e escolha a organização correta.\n- **Logs.** **MCP: List Servers → Show Output** para erros de conexão.\n\n## O que o agente pode fazer\n\nListar e organizar arquivos e pastas, enviar e baixar dentro dos seus escopos e ajudar com membros e convites quando a sua função permitir. Detalhes: [MCP](/docs/agents/mcp).\n\nVoltar para [Conectar](/docs/agents/connect).\n\n## Para agentes\n\n```json\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\n- O VS Code usa a chave `servers` (não `mcpServers`) em `.vscode/mcp.json`\n- Ferramentas: apenas `execute` e `search`\n- Organização: `principal_get` dentro de `execute` (sem ferramenta `context`)\n- Hub: `https://www.siglata.com/docs/agents/connect`"},{"@type":"TechArticle","name":"MCP","description":"Veja as ferramentas, operações e escopos que o agente recebe.","url":"https://www.siglata.com/docs/agents/mcp","inLanguage":"pt-BR","text":"O Model Context Protocol (MCP) permite que agentes de IA e ferramentas de desenvolvimento acessem suas organizações e arquivos no Siglata. O servidor usa Streamable HTTP e OAuth 2.0. Os escopos de permissão e a verificação de vínculo com a organização determinam o que cada conexão pode acessar.\n\nO endpoint de produção do MCP é:\n\n```text\nhttps://www.siglata.com/v1/mcp\n```\n\n## Identidade do servidor [#server-identity]\n\nEste servidor publica strings de identidade distintas em cada camada.\n\n| Camada | String atual | Quem lê |\n| :-- | :-- | :-- |\n| Product / title | `Siglata` (`serverInfo.title`) | Clientes MCP que exibem um título de produto |\n| Protocol server name | `siglata` (MCP `initialize` / `serverInfo.name`) | Clientes MCP durante `initialize` |\n| Script engine | `CallScript` (`callscript` npm) | Chamadores de `execute` e `search` |\n| Registry package id | `com.siglata/mcp` | Registros MCP |\n| Plugin / skill key | `siglata` | Carregadores de plugin e skill de agentes |\n\n[CallScript](https://www.callscript.dev/) é o mecanismo de `execute` e `search`, não a marca do produto.\n\n## Superfície de Capacidades [#capability-surface]\n\n- **Nome do servidor**: `siglata`.\n- **Ferramentas**: exatamente duas, `execute` e `search`.\n- **Operações**: operações de gerenciamento, chamáveis dentro de scripts `execute` e não como ferramentas MCP.\n- **Contexto de organização**: Chame `principal_get` dentro de um script `execute` para saber a qual organização esta concessão está vinculada (`organizationId`), além de `userId`, `role` e `scopes`. Chame `organization_get` para o nome ou o slug da organização vinculada. Chame `organizations_list` para ver todas as organizações às quais o usuário autorizador pertence; o sinalizador `current` marca a organização vinculada à concessão. Listar não troca a concessão — outro espaço de trabalho exige uma nova conexão OAuth autorizada com essa organização ativa no consentimento.\n- **Recursos**: um template, `siglata:///files/{fileId}`, para concessões com `files:read`. O servidor não expõe listagem de recursos. `subscriptions/listen` sobre esses URIs (até 64 por stream) emite `notifications/resources/updated` quando os metadados ou a legibilidade de um arquivo observado mudam; o stream permanece vinculado à validade da concessão e da sessão.\n- **Prompts**: um, `siglata-callscript` — o fluxo de trabalho CallScript `search` → `execute` como mensagem de usuário reutilizável.\n- **DPoP**: opcional. A prova é validada e o token vinculado à sua chave quando o cliente apresenta uma, e tokens bearer simples continuam funcionando.\n\n## Fluxo de Autorização e Conexão [#authorization-flow]\n\nA conexão de um cliente MCP utiliza um fluxo padrão de código de autorização OAuth 2.0 em conformidade com as RFCs:\n\n1. **Adicionar Endpoint**: Configure seu cliente com a URL do servidor `https://www.siglata.com/v1/mcp`.\n2. **Iniciar OAuth**: O cliente abre uma janela do navegador apontando para o endpoint de autorização do Siglata.\n3. **Autenticar**: Entre com o link mágico recebido por e-mail, caso ainda não esteja autenticado.\n4. **Selecionar Organização**: Escolha a organização específica que esta conexão poderá acessar. Cada concessão é estritamente vinculada a um único ID de organização.\n5. **Aprovar Escopos**: Revise os escopos de capacidade solicitados (por exemplo, `files:read`, `files:write`, `organizations:read`) e aprove o acesso.\n6. **Entrega do Token**: O cliente recebe um token de acesso delimitado exclusivamente à organização escolhida.\n\n```\n┌────────────────┐        1. Fluxo OAuth       ┌──────────────────┐\n│   Cliente MCP  │ ──────────────────────────> │  Autenticação    │\n│ (Claude/Cursor)│ <────────────────────────── │  (Siglata Auth)  │\n└────────────────┘      2. Token Delimitado    └──────────────────┘\n        │\n        │ 3. JSON-RPC (POST /v1/mcp)\n        ▼\n┌─────────────────────────────────────────────────────────────────┐\n│                     Servidor MCP Siglata                        │\n│  - Verificação de Origem e Validação de Sessão                  │\n│  - Checagem Dinâmica de Associação e Políticas de Escopo        │\n│  - Isolamento Estrito de Limite Organizacional                  │\n└─────────────────────────────────────────────────────────────────┘\n        │                                 │\n        ▼                                 ▼\n┌──────────────────┐              ┌──────────────────┐\n│   Arquivos       │              │  Organização     │\n│ (Blocos de 8MiB) │              │ (RBAC / Convites)│\n└──────────────────┘              └──────────────────┘\n```\n\n## Autorização de dispositivo para CLI [#cli-device-authorization]\n\nCLIs sem navegador usam a concessão de autorização de dispositivo OAuth 2.0 (`urn:ietf:params:oauth:grant-type:device_code`). Registre um cliente público (`token_endpoint_auth_method: none`) cujos `grant_types` incluam essa concessão (e `refresh_token` se precisar renovar). A descoberta anuncia `device_authorization_endpoint`.\n\n1. `POST /auth/device/code` com `client_id`, `scope` e `resource` definido como `https://www.siglata.com/v1/mcp`.\n2. Abra `verification_uri` (ou `verification_uri_complete`) no navegador — o Siglata serve `/app/device`. Entre, selecione uma organização se necessário e aprove.\n3. Faça polling em `POST /auth/oauth2/token` com `grant_type=urn:ietf:params:oauth:grant-type:device_code` até receber o access token. **Não** use `/auth/device/token` para MCP; esse endpoint não é o caminho OAuth do MCP.\n\nO JWT emitido tem `aud` = o recurso MCP e `organizationId` congelado na organização ativa no momento da aprovação. Mudar a organização ativa depois não reassocia uma concessão de dispositivo existente — autorize de novo para outro espaço de trabalho.\n\nClientes IDE com código de autorização continuam usando `/oauth2/authorize` → `/app/consent` sem mudanças.\n\n## Escopos OAuth [#oauth-scopes]\n\nO Siglata aplica escopos de capacidade fundamentados no princípio do menor privilégio:\n\n| Escopo | Descrição | Função Mínima |\n| :-- | :-- | :-- |\n| `files:read` | Inspecionar arquivos ativos, listar lixeira, consultar métricas de armazenamento e obter URLs autenticadas de download. | `member` |\n| `files:write` | Reservar uploads, concluir transferências, cancelar uploads, renomear arquivos, mover para lixeira e restaurar arquivos. | `member` |\n| `organizations:read` | Ler perfil e metadados da organização concedida. | `member` |\n| `organizations:write` | Atualizar nome ou slug da organização, ou criar novas organizações. | `admin` |\n| `members:read` | Listar membros da organização e visualizar convites pendentes. | `member` |\n| `members:write` | Convidar novos membros, cancelar convites pendentes, atualizar funções ou remover membros. | `admin` |\n\nAlém dos escopos OAuth, o Siglata valida sua associação ativa na organização em tempo real a cada operação. Se a função de um usuário for alterada ou o acesso for revogado, a operação será bloqueada imediatamente. O MCP de produto também exige nível de acesso por organização (`testing` ou `upgraded`); organizações com status `revoked` (linhas ausentes passam a `testing`) falham com `MCP_ACCESS_REVOKED`.\n\n## Referência de Ferramentas e Operações [#tools-reference]\n\n`tools/list` anuncia exatamente duas ferramentas, baseadas em [CallScript](https://www.callscript.dev/):\n\n- **`execute`** executa um script que agrupa operações de gerenciamento em uma única chamada. As chamadas rodam no servidor e se compõem: um script pode listar arquivos e depois renomear ou mover cada resultado — apenas o valor retornado atravessa a rede.\n- **`search`** lista as assinaturas das operações que esta concessão pode chamar, para que o cliente descubra seu conjunto disponível sem tentativas.\n\n```js title=\"Um script execute agrupando duas operações\"\nconst trash = await files_list({ state: \"trash\" });\nconst storage = await storage_get({});\nreturn { trash, storage };\n```\n\nAs operações abaixo são funções dentro de scripts `execute` — chamar uma delas diretamente pelo nome via `tools/call` retorna um erro JSON-RPC com `error.code` `-32602` e `error.data.code` `USE_EXECUTE`, redirecionando o chamador para `execute`. Uma operação cujo escopo ou função de membro exigidos esteja ausente nunca é montada para a concessão: `search` não a lista e um script que a nomeie falha na validação. Os cartões do `search` declaram os códigos de falha de cada operação, e scripts contendo passos `suspend` são rejeitados como `invalid` — escreva scripts de passagem única.\n\nChame `search` para obter o cartão de assinatura de cada operação que esta concessão pode chamar — parâmetros, formatos de retorno e códigos de falha declarados — filtrado pelos escopos e pela função da concessão.\n\n### Arquivos\n\n| Operação | Descrição |\n| :-- | :-- |\n| `files_list` | Lista arquivos ativos ou itens recuperáveis da lixeira na organização. |\n| `uploads_list` | Lista uploads não finalizados para que possam ser retomados ou cancelados. |\n| `storage_get` | Consulta as métricas atuais de armazenamento da organização em bytes. |\n| `file_get` | Lê os metadados e o estado de ciclo de vida de um arquivo. |\n| `folder_get` | Lê os metadados e o estado de ciclo de vida de uma pasta. |\n| `file_read` | Lê os bytes de um arquivo inline, ou retorna instruções autenticadas de transferência para arquivos maiores. |\n| `sheet_list` | Lista as planilhas de um `.xlsx` armazenado sem devolver os bytes do workbook. |\n| `sheet_read` | Lê um intervalo A1 de um `.xlsx` armazenado como células JSON sem devolver os bytes do workbook. |\n| `sheet_write` | Aplica um ou mais patches em intervalos A1 (`patches[]`) de um workbook existente, preserva as células fora desses intervalos e as abas não tocadas, e devolve o id de arquivo de uma nova edição sem devolver os bytes do workbook. |\n| `relation_extract` | Extrai tabelas de relação nomeadas de workbooks `.xlsx` armazenados, um resultado por seção solicitada; `persist` grava cada seção extraída como tabela em `rel_<org>` para `sql_query`. |\n| `attach_workbook` | Anexa cada planilha de um `.xlsx` armazenado como tabela em `rel_<org>`, com proveniência `siglata.file-id`; as tabelas vivem enquanto o arquivo de origem existir. |\n| `sql_query` | Executa uma instrução SQL sobre as tabelas `rel_<org>.<tabela>` desta organização, reautorizando o arquivo de origem de cada tabela referenciada; resultados limitados a 10.000 linhas. |\n| `relation_list` | Lista as tabelas `rel_<org>` que esta concessão pode ler — relações persistidas e planilhas anexadas — com nome qualificado, arquivo de origem, planilha e contagem de linhas. |\n| `doc_list` | Conta os parágrafos do corpo de um `.docx` armazenado sem devolver os bytes do documento. |\n| `doc_read` | Lê o texto simples dos parágrafos de um `.docx` armazenado sem devolver os bytes do documento. |\n| `pdf_list` | Conta as páginas de um PDF armazenado sem devolver os bytes do documento. |\n| `pdf_read` | Lê o texto simples das páginas de um PDF armazenado sem devolver os bytes do documento. |\n| `ppt_list` | Lista índices e títulos dos slides de um `.pptx` armazenado sem devolver os bytes do arquivo. |\n| `ppt_read` | Lê o texto simples dos parágrafos dos slides e as `notes` do apresentador de um `.pptx` armazenado sem devolver os bytes do arquivo. |\n| `file_download` | Obtém instruções autenticadas de download HTTP para um arquivo. |\n| `file_write` | Cria um arquivo pequeno inline. |\n| `file_rename` | Renomeia um arquivo sem modificar ou reenviar seus bytes armazenados. |\n| `file_set_visibility` | Define a visibilidade de um arquivo como organizacional ou restrita. |\n| `file_move` | Move um arquivo para uma pasta ou de volta à raiz da organização. |\n| `file_copy` | Copia um arquivo ativo para uma pasta ou a raiz da organização, cobrando a cota de armazenamento pelo tamanho total. |\n| `file_trash` | Move um arquivo ativo para a lixeira recuperável. |\n| `file_restore` | Restaura um arquivo da lixeira para o estado ativo. |\n| `file_purge` | Exclui permanentemente um arquivo da lixeira e libera sua cota de armazenamento. |\n| `upload_begin` | Reserva cota de armazenamento e inicia uma sessão de upload em partes. |\n| `upload_complete` | Finaliza um upload após a transferência de todas as partes. |\n| `upload_cancel` | Cancela um upload não finalizado e libera sua reserva de cota. |\n\n### Pastas e Acesso\n\n| Operação | Descrição |\n| :-- | :-- |\n| `folders_list` | Lista as pastas da organização. |\n| `folder_create` | Cria uma pasta, opcionalmente aninhada sob uma pasta pai. |\n| `folder_rename` | Renomeia uma pasta sem afetar seu conteúdo. |\n| `folder_set_visibility` | Define a visibilidade de uma pasta como organizacional ou restrita. |\n| `folder_move` | Move uma pasta para uma nova pasta pai ou de volta à raiz da organização. |\n| `folder_copy` | Copia em profundidade uma pasta ativa e retorna apenas a nova pasta raiz. |\n| `folder_trash` | Move uma pasta para a lixeira recuperável. |\n| `folder_restore` | Restaura uma pasta da lixeira antes do prazo de recuperação. |\n| `folder_purge` | Exclui permanentemente uma pasta da lixeira. |\n| `grants_list` | Lista as concessões de acesso explícitas de um arquivo ou pasta. |\n| `grant_create` | Concede a um membro acesso de leitura ou escrita a um arquivo ou pasta. |\n| `grant_revoke` | Revoga uma concessão de acesso. |\n\n### Organização e Equipe\n\n| Operação | Descrição |\n| :-- | :-- |\n| `principal_get` | Lê a identidade, a função e os escopos vinculados a esta concessão. |\n| `organization_get` | Retorna os detalhes da organização selecionada. |\n| `organizations_list` | Lista as organizações às quais o usuário autorizador pertence; `current` marca a organização vinculada à concessão sem trocá-la. |\n| `organization_update` | Atualiza o nome ou slug da organização selecionada. |\n| `organization_create` | Cria uma nova organização. |\n| `organization_delete` | Exclui permanentemente a organização selecionada e seus arquivos. Somente proprietário. |\n| `members_list` | Lista os membros da organização com paginação. |\n| `member_update_role` | Altera a função de um membro na equipe. |\n| `member_remove` | Remove um membro da organização. |\n| `invitation_create` | Convida um novo membro para a organização por e-mail. |\n| `invitation_resend` | Reenvia o e-mail de um convite pendente da organização selecionada. |\n| `invitations_list` | Lista todos os convites pendentes da organização. |\n| `invitation_cancel` | Cancela um convite ainda não aceito. |\n| `invitations_mine` | Lista os convites pendentes endereçados ao usuário autorizador (podem incluir outras organizações). |\n| `invitation_accept` | Aceita um convite pendente somente da organização vinculada à concessão. Não religa a concessão OAuth; aceitar outra organização exige aceite no console e uma nova concessão. |\n| `invitation_reject` | Rejeita um convite pendente somente da organização vinculada à concessão. Não religa a concessão OAuth. |\n| `organization_leave` | Sai da organização vinculada à concessão. A próxima chamada MCP falha por falta de associação. |\n| `sessions_list` | Lista as sessões de concessão MCP ativas do próprio principal. |\n| `session_revoke` | Revoga uma das suas próprias sessões de concessão MCP. |\n\n## Recursos [#resources]\n\nConcessões com `files:read` também veem um modelo de recurso, `siglata:///files/{fileId}`, que resolve os bytes de um arquivo via `resources/read`. Mídias textuais retornam texto decodificado e demais mídias retornam base64 para arquivos de até 1 MiB; arquivos maiores resolvem nas mesmas instruções autenticadas de transferência de `file_read`. A concessão é verificada novamente a cada leitura.\n\n### Observando arquivos [#watching-files]\n\n`subscriptions/listen` sobre URIs `siglata:///files/{fileId}` abre um stream server-sent que emite `notifications/resources/updated` quando um arquivo observado muda. O stream honra até 64 URIs; URIs fora do modelo, ou qualquer assinatura em uma concessão sem `files:read`, são rejeitados antes de o stream abrir.\n\nA primeira observação de cada URI é uma linha de base e nunca emite. Depois disso, uma notificação é emitida quando os metadados de um arquivo mudam, quando ele se torna ilegível para esta concessão (excluído, restrito ou com a concessão revogada) e quando volta a ser legível. Estados idênticos ou repetidamente ilegíveis permanecem silenciosos — uma notificação significa \"releia o recurso\", nunca um diff de conteúdo.\n\nCada URI observado é reautorizado em toda avaliação sob a concessão que abriu o stream: um arquivo que você não pode mais ler é indistinguível de um que não existe. Mutações de arquivos enviam um aviso de melhor esforço ao hub de observação para baixa latência; uma varredura periódica verifica novamente cada observador, de modo que um aviso perdido ainda é recuperado. O stream termina quando o cliente desconecta, quando a concessão deixa de resolver (sessão revogada, perda de vínculo à organização) ou no menor entre o vencimento da concessão e uma hora — clientes voltam a escutar para continuar observando.\n\n## Instalação [#install]\n\nConecte-se via OAuth a `https://www.siglata.com/v1/mcp`. Os passos de instalação por cliente ficam em páginas dedicadas (comandos para copiar e colar para pessoas e agentes). Comece em [Conectar](/docs/agents/connect).\n\n- Comprovados (v1): [Cursor](/docs/agents/install/cursor), [Codex](/docs/agents/install/codex)\n- Instaláveis / compatíveis com a especificação: [ChatGPT Desktop](/docs/agents/install/chatgpt-desktop), [Claude Desktop](/docs/agents/install/claude-desktop), [VS Code](/docs/agents/install/vs-code)\n\nEsta página documenta apenas a superfície MCP (`execute`, `search`, operações CallScript, recursos, escopos). Ela não duplica esses guias de instalação.\n\n## Segurança e Revogação [#security]\n\n- **Isolamento Multi-Inquilino**: Cada concessão MCP permite acesso a exatamente uma organização. Para acessar outro espaço de trabalho, autentique uma conexão adicional.\n- **Validação de Estado Ativo**: Os tokens são validados contra os registros de sessão no banco de dados e a associação ativa na organização a cada solicitação.\n- **Revogação**: Uma concessão deixa de funcionar quando a sessão autorizadora termina ou quando o membro sai da organização. Derrube uma conexão pelo próprio protocolo com `session_revoke`, revogue a sessão com `POST /auth/revoke-session` ou remova o membro com `member_remove`; em todos os casos, a próxima requisição do cliente é rejeitada.\n\n## Alterando escopos após a autorização [#changing-scopes]\n\nOs escopos são escolhidos no consentimento e armazenados na concessão. Não existe API de mutação de escopos após a concessão (`scopes_update` ou similar), porque ampliar escopos sem novo consentimento contornaria o limite de confiança do consentimento. Para alterar escopos, revogue a concessão atual com `session_revoke` (ou revogue a sessão / saia da organização), então execute o OAuth novamente e aprove o conjunto de escopos desejado no consentimento.\n\n## MCP Registry [#mcp-registry]\n\nO servidor está listado no MCP Registry oficial como [com.siglata/mcp](https://registry.modelcontextprotocol.io/v0.1/servers/com.siglata%2Fmcp/versions/latest)."},{"@type":"TechArticle","name":"Connect","description":"Pick the app and approve access to Siglata.","url":"https://www.siglata.com/docs/en-US/agents/connect","inLanguage":"en-US","text":"Siglata connects to an AI agent through one address. Once connected, your agent works with your organization's files, folders, and members under your own membership and role.\n\n```text\nhttps://www.siglata.com/v1/mcp\n```\n\nThere is no API key to create and nothing to paste into a settings field beyond that address. You sign in with an email magic link, and you pick one organization while you connect.\n\n## Pick Your App [#pick-your-app]\n\nChoose the app you already use. Start with the [OS-aware install hub](/docs/en-US/agents/install) if you want the page to pick Bash or PowerShell for you. Each app page carries the full steps, a copy-paste block, and a way to check the connection worked.\n\n| App | Install page | Status |\n| :-- | :-- | :-- |\n| Cursor | [Connect Cursor](/docs/en-US/agents/install/cursor) | Proven (v1) |\n| Codex | [Connect Codex](/docs/en-US/agents/install/codex) | Proven (v1) |\n| ChatGPT Desktop | [Connect ChatGPT Desktop](/docs/en-US/agents/install/chatgpt-desktop) | Installable / spec-compatible |\n| Claude Desktop | [Connect Claude Desktop](/docs/en-US/agents/install/claude-desktop) | Installable / spec-compatible |\n| VS Code | [Connect VS Code](/docs/en-US/agents/install/vs-code) | Installable / spec-compatible |\n\n**Proven (v1)** means Cursor and Codex are the clients Siglata verified for this release. **Installable / spec-compatible** means the same MCP endpoint works when the app supports remote Streamable HTTP and OAuth. Steps may vary slightly by app version.\n\nThese pages are install how-tos only. They do not replace the marketing site or the MCP capability reference.\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Open the [Siglata Console](https://www.siglata.com/app) and sign in with a magic link. See [Sign in](/docs/en-US/sign-in).\n- One of the apps above, installed and up to date.\n\n## What Happens While You Connect [#authorization]\n\nEvery app follows the same five moments, whatever its settings screen looks like.\n\n1. You give the app the address `https://www.siglata.com/v1/mcp`.\n2. The app opens your browser on Siglata.\n3. You sign in with your email magic link if you are not signed in already.\n4. You pick the organization this connection may reach. One connection reaches one organization.\n5. You approve the permissions the app asked for, and the app stores its access token.\n\n## You're Done When [#done]\n\n- Your app lists Siglata as connected.\n- The tool list shows exactly two tools, `execute` and `search`.\n- You ask the agent to list the files in your organization, and it answers with your files.\n\n## What the Agent Can Do [#capabilities]\n\nWith the usual permissions, your agent can list files and folders, upload new ones, download and read them, rename them, move them between folders, send files to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles.\n\nEach connection stays inside one organization, and it can never do more than the permissions you approved. For the exact list of operations and the permission each one needs, read [MCP](/docs/en-US/agents/mcp).\n\n## Connecting a Second Organization [#second-organization]\n\nAn organization is chosen once per connection. To reach a second organization from the same app, add a second server entry under a different name, such as `siglata-acme`, and pick the other organization while you authorize it.\n\n## For Agents [#for-agents]\n\n- Endpoint `https://www.siglata.com/v1/mcp`, Streamable HTTP, OAuth 2.0 with dynamic client registration at `POST /auth/oauth2/register`.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools.\n- Call `principal_get` inside an `execute` script to read the organization this grant is bound to, plus the user ID, role, and scopes. Call `organization_get` for the name and slug.\n- Install pages: [Cursor](/docs/en-US/agents/install/cursor), [Codex](/docs/en-US/agents/install/codex), [ChatGPT Desktop](/docs/en-US/agents/install/chatgpt-desktop), [Claude Desktop](/docs/en-US/agents/install/claude-desktop), [VS Code](/docs/en-US/agents/install/vs-code).\n- OS-aware install hub: [Install](/docs/en-US/agents/install).\n- Capability reference: [MCP](/docs/en-US/agents/mcp)."},{"@type":"TechArticle","name":"Agents","description":"Connect an AI app to Siglata and see what MCP allows.","url":"https://www.siglata.com/docs/en-US/agents/","inLanguage":"en-US","text":"Connect the agent you already use. After that, it works with the organization's files under the same roles and permissions as the Siglata app.\n\n| Page | Outcome |\n| :-- | :-- |\n| [Connect](/docs/en-US/agents/connect) | Pick the app and approve access. |\n| [MCP](/docs/en-US/agents/mcp) | See tools, operations, and scopes. |\n| [Install](/docs/en-US/agents/install) | Copy the steps for your operating system and app. |"},{"@type":"TechArticle","name":"Connect ChatGPT Work on desktop","description":"Connect ChatGPT Work in the desktop app to Siglata through MCP settings, using the same local server configuration as Codex.","url":"https://www.siglata.com/docs/en-US/agents/install/chatgpt-desktop","inLanguage":"en-US","text":"This guide covers ChatGPT Work in the ChatGPT desktop app. The desktop app adds MCP servers from its settings window. You paste the Siglata address, save, and sign in once in your browser. This path is **installable / spec-compatible** for v1 (Cursor and Codex are the proven clients).\n\nChatGPT Desktop and the Codex CLI share one configuration file, `~/.codex/config.toml`. A server you add in either app appears in both. See [Connect Codex](/docs/en-US/agents/install/codex).\n\nHosted Work on the web uses plugins instead of local MCP settings. See [OpenAI's MCP setup guide](https://learn.chatgpt.com/docs/en-US/extend/mcp?surface=cli) for the desktop and web paths.\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Sign in once at the [Siglata Console](https://www.siglata.com/app). See [Sign in](/docs/en-US/sign-in).\n- The ChatGPT desktop app, installed and up to date, with access to Work.\n\n## Steps [#steps]\n\n1. Open **Settings** in ChatGPT Desktop.\n2. Go to **MCP servers**, then click **Add server**.\n3. Choose **Streamable HTTP** as the type.\n4. Name the server `siglata`.\n5. Paste the address into the URL field.\n\n   ```text\n   https://www.siglata.com/v1/mcp\n   ```\n\n6. Click **Save**.\n7. Restart ChatGPT Desktop.\n8. Open **Settings** then **MCP servers** again, and start the sign-in for **siglata**. Your browser opens on Siglata.\n9. Sign in with your email magic link if you are not signed in already.\n10. Pick the organization this connection may reach, then approve the permissions ChatGPT Desktop asked for.\n\n## You're Done When [#done]\n\n- **Settings** then **MCP servers** lists **siglata** as connected, with no sign-in prompt left.\n- The server lists exactly two tools, `execute` and `search`.\n- You ask ChatGPT to list the files in your Siglata organization, and it answers with your files.\n\n## Troubleshooting [#troubleshooting]\n\n- **The server stays disconnected after you save.** Restart the app. A server added while the app is running is picked up on the next start.\n- **The sign-in window closed before it finished.** Start the sign-in again from **MCP servers**. The authorization link expires after a few minutes.\n- **The tools never appear in a chat.** Open the tools menu in the composer and turn **siglata** on for that conversation.\n- **The agent reads the wrong organization.** A connection is bound to the organization you picked while authorizing. Add a second server named `siglata-acme` with the same address, and pick the other organization when it asks.\n- **Calls fail with 401.** Your grant ended, because the session was revoked or your membership changed. Sign in again from **MCP servers**.\n- **The server also showed up in Codex.** That is expected. The two apps read the same `~/.codex/config.toml`.\n\n## What the Agent Can Do [#capabilities]\n\nChatGPT can list files and folders, upload new ones, download and read them, rename them, move them, send them to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles. It never reaches past the organization you picked, and never past the permissions you approved.\n\nThe full operation list, with the permission each one needs, is in [MCP](/docs/en-US/agents/mcp).\n\n## For Agents [#for-agents]\n\n```bash\ncodex mcp add siglata --url https://www.siglata.com/v1/mcp\ncodex mcp login siglata\n```\n\n- The settings window and the commands above write the same entry, in `~/.codex/config.toml`.\n- Transport is Streamable HTTP at `https://www.siglata.com/v1/mcp`. Authorization is OAuth 2.0, and the client registers dynamically.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools. Call `search` to list the operations this grant may call.\n- Call `principal_get` inside an `execute` script to read the bound `organizationId`, plus `userId`, `role`, and `scopes`.\n- Other clients: [Connect](/docs/en-US/agents/connect)."},{"@type":"TechArticle","name":"Connect Claude Desktop","description":"Add Siglata as a remote connector in Claude Desktop, then sign in and choose your organization.","url":"https://www.siglata.com/docs/en-US/agents/install/claude-desktop","inLanguage":"en-US","text":"Connect Claude Desktop to Siglata through a custom remote connector. Add the server URL in **Customize > Connectors**, then sign in to Siglata. This path is **installable / spec-compatible** for v1 (Cursor and Codex are the proven clients).\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Sign in once at the [Siglata Console](https://www.siglata.com/app). See [Sign in](/docs/en-US/sign-in).\n- Claude Desktop, installed and up to date.\n\nIf you use Claude Team or Enterprise, ask an Owner to add Siglata under **Organization settings > Connectors** first. The Owner selects **Add > Custom > Web** and uses the server URL below. Each member then connects their own Siglata account.\n\n## Add the connector [#steps]\n\n1. Open **Customize > Connectors** in Claude Desktop.\n2. If Siglata is already listed, continue to [Connect your account](#connect).\n3. For an individual account, select **+ > Add custom connector**.\n4. Name the connector `siglata` and enter this URL:\n\n   ```text\n   https://www.siglata.com/v1/mcp\n   ```\n\n5. Select **Add**.\n\n## Connect your account [#connect]\n\n1. Find **siglata** in **Customize > Connectors** and select **Connect**.\n2. Sign in to Siglata with your email magic link if needed.\n3. Choose the Siglata organization this connection may reach.\n4. Approve the requested permissions.\n5. In your conversation, open **+ > Connectors** and enable **siglata**.\n\nThe remote connector is configured through your Claude account. See [Anthropic's remote connector instructions](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp) for account and workspace requirements.\n\n## You're Done When [#done]\n\n- **Customize > Connectors** shows **siglata** as connected.\n- The server lists exactly two tools, `execute` and `search`.\n- You ask Claude to list the files in your Siglata organization, and it answers with your files.\n\n## Troubleshooting [#troubleshooting]\n\n- **Siglata is missing from your Team or Enterprise workspace.** Ask an Owner to add the remote connector, then connect your account.\n- **The sign-in window closed before it finished.** Select **Connect** again from **Customize > Connectors**.\n- **The agent reads the wrong organization.** Disconnect Siglata and reconnect it. Choose the correct organization during authorization.\n- **The tools are missing from the conversation.** Open **+ > Connectors** and enable **siglata**.\n- **Calls fail with 401.** Your grant ended, because the session was revoked or your membership changed. Reconnect Siglata to authorize a fresh grant.\n\n## What the Agent Can Do [#capabilities]\n\nClaude can list files and folders, upload new ones, download and read them, rename them, move them, send them to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles. It never reaches past the organization you picked, and never past the permissions you approved.\n\nThe full operation list, with the permission each one needs, is in [MCP](/docs/en-US/agents/mcp).\n\n## For Agents [#for-agents]\n\n- Add the remote connector in **Customize > Connectors**, then select **Connect** for `siglata`.\n- Server URL: `https://www.siglata.com/v1/mcp`. Transport is Streamable HTTP and authorization is OAuth 2.0.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools. Call `search` to list the operations this grant may call.\n- Call `principal_get` inside an `execute` script to read the bound `organizationId`, plus `userId`, `role`, and `scopes`.\n- Other clients: [Connect](/docs/en-US/agents/connect)."},{"@type":"TechArticle","name":"Connect Codex","description":"Install the Siglata plugin in Codex with two commands, or add the MCP server directly from the command line.","url":"https://www.siglata.com/docs/en-US/agents/install/codex","inLanguage":"en-US","text":"Codex installs Siglata as a plugin. Two commands add the marketplace and the plugin, and the first session asks you to sign in. Codex is a **proven (v1)** client.\n\nCodex shares its configuration with ChatGPT Desktop, so a server you add here also appears there. See [Connect ChatGPT Desktop](/docs/en-US/agents/install/chatgpt-desktop).\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Sign in once at the [Siglata Console](https://www.siglata.com/app). See [Sign in](/docs/en-US/sign-in).\n- The Codex CLI, installed and up to date.\n\n## Steps [#steps]\n\n1. Add the Siglata marketplace and install the plugin.\n\n   ```bash\n   codex plugin marketplace add siglata/agent-plugins\n   codex plugin add siglata@siglata-agent-plugins\n   ```\n\n2. Start a new Codex session. Codex loads plugins and MCP servers when a session starts, so an open session does not see the new plugin.\n3. Run `/mcp` in the session. Codex lists **siglata** and offers to authenticate it.\n4. Follow the link Codex prints. Your browser opens on Siglata.\n5. Sign in with your email magic link if you are not signed in already.\n6. Pick the organization this connection may reach, then approve the permissions Codex asked for.\n7. Return to the terminal. Codex reports the server as connected.\n\n### Without the Plugin [#mcp-only]\n\nTo add the MCP server on its own, skip the plugin and run this instead.\n\n```bash\ncodex mcp add siglata --url https://www.siglata.com/v1/mcp\ncodex mcp login siglata\n```\n\nBoth commands write to `~/.codex/config.toml`, the same file the plugin uses.\n\n## You're Done When [#done]\n\n- `codex mcp list` includes **siglata**.\n- `/mcp` in a session shows exactly two tools for Siglata, `execute` and `search`.\n- You ask Codex to list the files in your Siglata organization, and it answers with your files.\n\n## Troubleshooting [#troubleshooting]\n\n- **`/mcp` does not list Siglata.** Quit the session and start a new one. Codex reads its server list at session start.\n- **Codex says the server is not authenticated.** Run `codex mcp login siglata` and finish the browser step.\n- **The browser step ended without a confirmation.** Run `codex mcp login siglata` again. The link expires after a few minutes.\n- **The agent reads the wrong organization.** A connection is bound to the organization you picked while authorizing. Run `codex mcp add siglata-acme --url https://www.siglata.com/v1/mcp`, then `codex mcp login siglata-acme`, and pick the other organization.\n- **Calls fail with 401.** Your grant ended, because the session was revoked or your membership changed. Run `codex mcp login siglata` to authorize a fresh grant.\n- **Your ChatGPT Desktop list changed too.** That is expected. The two apps read the same `~/.codex/config.toml`.\n\n## What the Agent Can Do [#capabilities]\n\nCodex can list files and folders, upload new ones, download and read them, rename them, move them, send them to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles. It never reaches past the organization you picked, and never past the permissions you approved.\n\nThe full operation list, with the permission each one needs, is in [MCP](/docs/en-US/agents/mcp).\n\n## For Agents [#for-agents]\n\n```bash\ncodex plugin marketplace add siglata/agent-plugins\ncodex plugin add siglata@siglata-agent-plugins\n# or, MCP only\ncodex mcp add siglata --url https://www.siglata.com/v1/mcp\ncodex mcp login siglata\n```\n\n- Transport is Streamable HTTP at `https://www.siglata.com/v1/mcp`. Authorization is OAuth 2.0, and Codex registers its client dynamically.\n- Server entries live in `~/.codex/config.toml`, shared with ChatGPT Desktop and the Codex IDE extension.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools. Call `search` to list the operations this grant may call.\n- Call `principal_get` inside an `execute` script to read the bound `organizationId`, plus `userId`, `role`, and `scopes`.\n- Other clients: [Connect](/docs/en-US/agents/connect)."},{"@type":"TechArticle","name":"Connect Cursor","description":"Add the Siglata MCP server to Cursor with a two-line mcp.json entry and a browser sign-in.","url":"https://www.siglata.com/docs/en-US/agents/install/cursor","inLanguage":"en-US","text":"Cursor reads MCP servers from a small JSON file. You add the Siglata address there, then sign in once in your browser. Cursor is a **proven (v1)** client.\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Sign in once at the [Siglata Console](https://www.siglata.com/app). See [Sign in](/docs/en-US/sign-in).\n- Cursor, installed and up to date.\n\n## Steps [#steps]\n\n1. Decide where the server should be available. Use `.cursor/mcp.json` inside a project for that project alone. Use `~/.cursor/mcp.json` for every project you open.\n2. Create the file if it does not exist, and put this in it.\n\n   ```json title=\".cursor/mcp.json\"\n   {\n     \"mcpServers\": {\n       \"siglata\": {\n         \"url\": \"https://www.siglata.com/v1/mcp\"\n       }\n     }\n   }\n   ```\n\n   The file already has an `mcpServers` block if you use other servers. In that case, add the `\"siglata\"` entry beside them and leave the rest alone.\n\n3. Save the file.\n4. Open **Cursor Settings** and go to **MCP**. The **siglata** server is listed there.\n5. Click **Login** next to **siglata**. Cursor opens your browser on Siglata.\n6. Sign in with your email magic link if you are not signed in already.\n7. Pick the organization this connection may reach, then approve the permissions Cursor asked for.\n8. Return to Cursor. The browser tab can be closed.\n\n## You're Done When [#done]\n\n- **Cursor Settings** then **MCP** shows **siglata** as enabled, with no login prompt left.\n- The server lists exactly two tools, `execute` and `search`.\n- You open the chat in agent mode, ask it to list the files in your Siglata organization, and it answers with your files.\n\n## Troubleshooting [#troubleshooting]\n\n- **The browser never opened.** Click **Login** again. A pop-up blocker or a second browser profile can swallow the first attempt.\n- **The server still asks for login after you approved.** Use the reload control next to **siglata** in **MCP** settings. Cursor picks the new token up on reload.\n- **The tool list is empty.** Check that the entry uses `\"url\"` and not `\"command\"`, and that the JSON parses. Then open the **Output** panel and select **MCP Logs** to read the error.\n- **The agent reads the wrong organization.** A connection is bound to the organization you picked while authorizing. Add a second entry under another name, such as `\"siglata-acme\"`, and pick the other organization when it asks.\n- **Calls fail with 401.** Your grant ended, because the session was revoked or your membership changed. Click **Login** again to authorize a fresh grant.\n\n## What the Agent Can Do [#capabilities]\n\nYour agent can list files and folders, upload new ones, download and read them, rename them, move them, send them to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles. It never reaches past the organization you picked, and never past the permissions you approved.\n\nThe full operation list, with the permission each one needs, is in [MCP](/docs/en-US/agents/mcp).\n\n## For Agents [#for-agents]\n\n```json title=\".cursor/mcp.json\"\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\n- Transport is Streamable HTTP at `https://www.siglata.com/v1/mcp`. Authorization is OAuth 2.0, and Cursor registers its client dynamically.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools. Call `search` to list the operations this grant may call.\n- Call `principal_get` inside an `execute` script to read the bound `organizationId`, plus `userId`, `role`, and `scopes`.\n- Other clients: [Connect](/docs/en-US/agents/connect)."},{"@type":"TechArticle","name":"Install","description":"Copy the steps for your operating system and app.","url":"https://www.siglata.com/docs/en-US/agents/install/","inLanguage":"en-US","text":"Use this page when you want the fastest safe path from “I have an agent” to “it can use my Siglata workspace.” The page checks your operating system in the browser, then shows Bash for macOS and Linux or PowerShell for Windows. You can override the choice at any time.\n\nFor Claude Desktop, follow the [remote connector guide](/docs/en-US/agents/install/claude-desktop). The Claude option below prints the connector instructions. For ChatGPT Work, these local commands apply to the desktop app. [Hosted Work uses plugins](https://learn.chatgpt.com/docs/en-US/extend/mcp?surface=cli).\n\n<div data-siglata-install-picker data-locale=\"en-US\" style=\"border: 1px solid var(--blume-border); border-radius: 8px; padding: 1rem; margin: 1.5rem 0;\">\n  <p style=\"margin: 0 0 0.75rem;\"><strong>Detected operating system:</strong> <span data-os-label>Checking...</span></p>\n  <div style=\"display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem;\">\n    <button type=\"button\" data-os-choice=\"mac\" style=\"border: 1px solid var(--blume-border); border-radius: 6px; padding: 0.4rem 0.65rem;\">macOS / Linux</button>\n    <button type=\"button\" data-os-choice=\"windows\" style=\"border: 1px solid var(--blume-border); border-radius: 6px; padding: 0.4rem 0.65rem;\">Windows</button>\n  </div>\n  <div data-os-panel=\"mac\">\n\n```bash\n#!/usr/bin/env bash\n# Pick one: codex, cursor, claude, vscode, chatgpt\nAGENT=\"${AGENT:-codex}\"\n\ncase \"$AGENT\" in\n  codex)\n    codex plugin marketplace add siglata/agent-plugins\n    codex plugin add siglata@siglata-agent-plugins\n    ;;\n  cursor)\n    mkdir -p .cursor\n    cat > .cursor/mcp.json <<'JSON'\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\nJSON\n    ;;\n  claude)\n    printf '%s\\n' \\\n      'In Claude Desktop, open Customize > Connectors.' \\\n      'Add a custom connector named siglata with this URL:' \\\n      'https://www.siglata.com/v1/mcp' \\\n      'Connect siglata, sign in, choose your organization, and approve access.' \\\n      'For Team or Enterprise, ask an Owner to add the connector first.'\n    ;;\n  vscode)\n    mkdir -p .vscode\n    cat > .vscode/mcp.json <<'JSON'\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\nJSON\n    ;;\n  chatgpt)\n    codex mcp add siglata --url https://www.siglata.com/v1/mcp\n    codex mcp login siglata\n    ;;\nesac\n```\n\n  </div>\n  <div data-os-panel=\"windows\" hidden>\n\n```powershell\n# Pick one: codex, cursor, claude, vscode, chatgpt\n$Agent = if ($env:AGENT) { $env:AGENT } else { \"codex\" }\n\nswitch ($Agent) {\n  \"codex\" {\n    codex plugin marketplace add siglata/agent-plugins\n    codex plugin add siglata@siglata-agent-plugins\n  }\n  \"cursor\" {\n    New-Item -ItemType Directory -Force -Path \".cursor\" | Out-Null\n    @'\n{\n  \"mcpServers\": {\n    \"siglata\": {\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n'@ | Set-Content -Encoding UTF8 \".cursor\\mcp.json\"\n  }\n  \"claude\" {\n    Write-Output \"In Claude Desktop, open Customize > Connectors.\"\n    Write-Output \"Add a custom connector named siglata with this URL:\"\n    Write-Output \"https://www.siglata.com/v1/mcp\"\n    Write-Output \"Connect siglata, sign in, choose your organization, and approve access.\"\n    Write-Output \"For Team or Enterprise, ask an Owner to add the connector first.\"\n  }\n  \"vscode\" {\n    New-Item -ItemType Directory -Force -Path \".vscode\" | Out-Null\n    @'\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n'@ | Set-Content -Encoding UTF8 \".vscode\\mcp.json\"\n  }\n  \"chatgpt\" {\n    codex mcp add siglata --url https://www.siglata.com/v1/mcp\n    codex mcp login siglata\n  }\n}\n```\n\n  </div>\n</div>\n\n<script>\n(() => {\n  const root = document.querySelector(\"[data-siglata-install-picker]\");\n  if (!(root instanceof HTMLElement)) {\n    return;\n  }\n\n  const labels = {\n    mac: \"macOS / Linux\",\n    windows: \"Windows\",\n  };\n\n  const label = root.querySelector(\"[data-os-label]\");\n  const choices = Array.from(root.querySelectorAll(\"[data-os-choice]\"));\n  const panels = Array.from(root.querySelectorAll(\"[data-os-panel]\"));\n  const platform = `${navigator.userAgent} ${navigator.platform}`.toLowerCase();\n\n  const setOs = (os) => {\n    if (label !== null) {\n      label.textContent = labels[os] ?? labels.mac;\n    }\n\n    for (const panel of panels) {\n      panel.hidden = panel.getAttribute(\"data-os-panel\") !== os;\n    }\n\n    for (const choice of choices) {\n      const selected = choice.getAttribute(\"data-os-choice\") === os;\n      choice.setAttribute(\"aria-pressed\", selected ? \"true\" : \"false\");\n    }\n  };\n\n  for (const choice of choices) {\n    choice.addEventListener(\"click\", () => {\n      const os = choice.getAttribute(\"data-os-choice\");\n\n      if (os === \"mac\" || os === \"windows\") {\n        setOs(os);\n      }\n    });\n  }\n\n  setOs(platform.includes(\"windows\") || platform.includes(\"win32\") ? \"windows\" : \"mac\");\n})();\n</script>\n\n## Choose Your Agent [#agents]\n\n| Agent | Best path | Status | Notes |\n| :-- | :-- | :-- | :-- |\n| Codex | Plugin commands | Proven (v1) | Installs Siglata skills and MCP together. Restart the Codex session after install. |\n| ChatGPT Work on desktop | Settings or shared Codex config | Installable / spec-compatible | Uses the same `~/.codex/config.toml` entry as Codex. |\n| Cursor | `.cursor/mcp.json` or MCP settings | Proven (v1) | Use project config for one repository or global config for every project. |\n| Claude Desktop | Custom remote connector | Installable / spec-compatible | Add Siglata in Customize > Connectors, then connect your account. |\n| VS Code | Command Palette or `.vscode/mcp.json` | Installable / spec-compatible | Use Copilot Chat in Agent mode and enable the server in the tools picker. |\n\n## After the Script [#after]\n\n1. Start or restart the agent.\n2. Begin the Siglata sign-in when the app offers it.\n3. Open the magic link in your email.\n4. Pick the organization this agent may reach.\n5. Approve the requested permissions.\n\nYou are done when the agent lists exactly two tools, `execute` and `search`, and can list files in your Siglata organization.\n\n## Detailed Guides [#guides]\n\n- [Connect Codex](/docs/en-US/agents/install/codex)\n- [Connect ChatGPT Work on desktop](/docs/en-US/agents/install/chatgpt-desktop)\n- [Connect Cursor](/docs/en-US/agents/install/cursor)\n- [Connect Claude Desktop](/docs/en-US/agents/install/claude-desktop)\n- [Connect VS Code](/docs/en-US/agents/install/vs-code)"},{"@type":"TechArticle","name":"Connect VS Code","description":"Add Siglata to VS Code from the Command Palette or a .vscode/mcp.json entry, then use it from Copilot Chat agent mode.","url":"https://www.siglata.com/docs/en-US/agents/install/vs-code","inLanguage":"en-US","text":"VS Code adds MCP servers from the Command Palette or from a JSON file in your workspace. Either way you paste the Siglata address once and sign in in your browser. GitHub Copilot Chat then uses Siglata in agent mode. This path is **installable / spec-compatible** for v1 (Cursor and Codex are the proven clients).\n\n## Before You Start [#prerequisites]\n\n- A Siglata account. Sign in once at the [Siglata Console](https://www.siglata.com/app). See [Sign in](/docs/en-US/sign-in).\n- VS Code with GitHub Copilot Chat, installed and up to date.\n\n## Steps [#steps]\n\n1. Open the Command Palette. Press `Cmd+Shift+P` on macOS or `Ctrl+Shift+P` on Windows and Linux.\n2. Run **MCP: Add Server**.\n3. Choose **HTTP** as the server type.\n4. Paste the address.\n\n   ```text\n   https://www.siglata.com/v1/mcp\n   ```\n\n5. Name the server `siglata`, then choose whether to save it in your workspace or in your user settings.\n6. Confirm the trust prompt. VS Code asks before it starts a server for the first time.\n7. Sign in when VS Code offers it. Your browser opens on Siglata.\n8. Sign in with your email magic link if you are not signed in already.\n9. Pick the organization this connection may reach, then approve the permissions VS Code asked for.\n\n### Edit the File Instead [#json]\n\nTo write the entry yourself, create `.vscode/mcp.json` in your workspace with this content. VS Code uses a `servers` key here, not `mcpServers`.\n\n```json title=\".vscode/mcp.json\"\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\nSave the file, then click **Start** above the `\"siglata\"` entry.\n\n## You're Done When [#done]\n\n- **MCP: List Servers** shows **siglata** as running.\n- The server lists exactly two tools, `execute` and `search`.\n- You open Copilot Chat in **Agent** mode, ask it to list the files in your Siglata organization, and it answers with your files.\n\n## Troubleshooting [#troubleshooting]\n\n- **The server does not start.** Run **MCP: List Servers**, select **siglata**, and open its output log. The log names the failing step.\n- **The sign-in window closed before it finished.** Run **MCP: List Servers**, select **siglata**, and start it again. The authorization link expires after a few minutes.\n- **Copilot ignores Siglata.** Switch the chat to **Agent** mode, open the tools picker, and turn **siglata** on. Ask mode does not call MCP tools.\n- **The agent reads the wrong organization.** A connection is bound to the organization you picked while authorizing. Add a second entry named `\"siglata-acme\"` with the same address, and pick the other organization when it asks.\n- **Calls fail with 401.** Your grant ended, because the session was revoked or your membership changed. Restart the server and sign in again.\n\n## What the Agent Can Do [#capabilities]\n\nCopilot can list files and folders, upload new ones, download and read them, rename them, move them, send them to the trash, and restore them within 30 days. It can also read your organization's profile, list members, invite people, and change roles. It never reaches past the organization you picked, and never past the permissions you approved.\n\nThe full operation list, with the permission each one needs, is in [MCP](/docs/en-US/agents/mcp).\n\n## For Agents [#for-agents]\n\n```json title=\".vscode/mcp.json\"\n{\n  \"servers\": {\n    \"siglata\": {\n      \"type\": \"http\",\n      \"url\": \"https://www.siglata.com/v1/mcp\"\n    }\n  }\n}\n```\n\n- Workspace entries live in `.vscode/mcp.json` under a `servers` key. User-level entries live in the profile `mcp.json` that **MCP: Open User Configuration** opens.\n- Transport is Streamable HTTP at `https://www.siglata.com/v1/mcp`. Authorization is OAuth 2.0, and the client registers dynamically.\n- `tools/list` returns exactly two tools, `execute` and `search`. There is no `context` tool.\n- Management operations are CallScript functions called inside an `execute` script, not MCP tools. Call `search` to list the operations this grant may call.\n- Call `principal_get` inside an `execute` script to read the bound `organizationId`, plus `userId`, `role`, and `scopes`.\n- Other clients: [Connect](/docs/en-US/agents/connect)."},{"@type":"TechArticle","name":"MCP","description":"See the tools, operations, and scopes the agent receives.","url":"https://www.siglata.com/docs/en-US/agents/mcp","inLanguage":"en-US","text":"The Model Context Protocol (MCP) lets AI agents and development tools access your Siglata organizations and files. The server uses Streamable HTTP and OAuth 2.0. Permission scopes and membership checks determine what each connection can access.\n\nThe product MCP endpoint is:\n\n```text\nhttps://www.siglata.com/v1/mcp\n```\n\n## Server identity [#server-identity]\n\nThis server publishes distinct identity strings at each layer.\n\n| Layer | String today | Who reads it |\n| :-- | :-- | :-- |\n| Product / title | `Siglata` (`serverInfo.title`) | MCP clients that show a product title |\n| Protocol server name | `siglata` (MCP `initialize` / `serverInfo.name`) | MCP clients during `initialize` |\n| Script engine | `CallScript` (`callscript` npm) | Callers of `execute` and `search` |\n| Registry package id | `com.siglata/mcp` | MCP registries |\n| Plugin / skill key | `siglata` | Agent plugin and skill loaders |\n\n[CallScript](https://www.callscript.dev/) is the engine for `execute` and `search`, not the product brand.\n\n## Capability Surface [#capability-surface]\n\n- **Server name**: `siglata`.\n- **Tools**: exactly two, `execute` and `search`.\n- **Operations**: Management operations are callable inside `execute` scripts rather than as MCP tools.\n- **Org awareness**: Call `principal_get` inside an `execute` script to learn which organization this grant is bound to (`organizationId`), plus `userId`, `role`, and `scopes`. Call `organization_get` for the bound organization's name or slug. Call `organizations_list` to see every organization the authorizing user belongs to; the `current` flag marks the grant-bound org. Listing does not switch the grant — a different workspace needs a new OAuth connection authorized with that org active at consent.\n- **Resources**: one template, `siglata:///files/{fileId}`, for grants holding `files:read`. The server exposes no resource list. `subscriptions/listen` on those URIs (up to 64 per stream) emits `notifications/resources/updated` when a watched file's metadata or readability changes; the stream stays bound to grant and session validity.\n- **Prompts**: one, `siglata-callscript` — the `search` → `execute` CallScript workflow as a pullable user message.\n- **DPoP**: optional. A proof is validated and the token bound to its key when a client presents one, and plain bearer tokens keep working.\n\n## Authorization & Connection Flow [#authorization-flow]\n\nConnecting an MCP client uses an RFC-compliant OAuth 2.0 authorization code flow:\n\n1. **Add Endpoint**: Configure your client with the server URL `https://www.siglata.com/v1/mcp`.\n2. **Initiate OAuth**: Your client opens a browser window targeting Siglata's authorization endpoint.\n3. **Authenticate**: Sign in via your email magic link if not already authenticated.\n4. **Select Organization**: Choose the specific organization this connection will access. Every grant is strictly bound to a single organization ID.\n5. **Approve Scopes**: Review the requested capability scopes (e.g., `files:read`, `files:write`, `organizations:read`) and authorize access.\n6. **Token Delivery**: The client receives an access token scoped exclusively to the chosen organization.\n\n```\n┌────────────────┐        1. OAuth Flow        ┌──────────────────┐\n│   MCP Client   │ ──────────────────────────> │  Siglata Auth    │\n│ (Claude/Cursor)│ <────────────────────────── │  (Siglata Auth)  │\n└────────────────┘       2. Scoped Token       └──────────────────┘\n        │\n        │ 3. JSON-RPC (POST /v1/mcp)\n        ▼\n┌─────────────────────────────────────────────────────────────────┐\n│                     Siglata MCP Server                          │\n│  - Origin Verification & Session Validation                     │\n│  - Dynamic Membership & Scope Policy Check                      │\n│  - Organization Boundary Isolation                              │\n└─────────────────────────────────────────────────────────────────┘\n        │                                 │\n        ▼                                 ▼\n┌──────────────────┐              ┌──────────────────┐\n│ File Operations  │              │  Org & Members   │\n│ (8 MiB chunks)   │              │ (RBAC / Invites) │\n└──────────────────┘              └──────────────────┘\n```\n\n## CLI device authorization [#cli-device-authorization]\n\nHeadless CLIs that cannot complete a browser redirect use the OAuth 2.0 device authorization grant (`urn:ietf:params:oauth:grant-type:device_code`). Register a public client (`token_endpoint_auth_method: none`) whose `grant_types` include that device grant (and `refresh_token` if you need refresh). Discovery advertises `device_authorization_endpoint`.\n\n1. `POST /auth/device/code` with `client_id`, `scope`, and `resource` set to `https://www.siglata.com/v1/mcp`.\n2. Open `verification_uri` (or `verification_uri_complete`) in a browser — Siglata serves `/app/device`. Sign in, select an organization if needed, and approve.\n3. Poll `POST /auth/oauth2/token` with `grant_type=urn:ietf:params:oauth:grant-type:device_code` until the access token arrives. Do **not** poll `/auth/device/token` for MCP; that endpoint is not the MCP OAuth token path.\n\nThe issued JWT has `aud` = the MCP resource and `organizationId` frozen to the organization active when the user approved. Changing the active organization later does not rebind an existing device grant — authorize again for a different workspace.\n\nAuthorization-code IDE clients keep using `/oauth2/authorize` → `/app/consent` unchanged.\n\n## OAuth Scopes [#oauth-scopes]\n\nSiglata enforces principle-of-least-privilege capability scopes:\n\n| Scope | Description | Minimum Role |\n| :-- | :-- | :-- |\n| `files:read` | Inspect active files, list trash, inspect storage metrics, and obtain authenticated download URLs. | `member` |\n| `files:write` | Reserve uploads, complete transfers, cancel uploads, rename files, trash, and restore files. | `member` |\n| `organizations:read` | Read organization profile and metadata for the granted workspace. | `member` |\n| `organizations:write` | Update organization name or slug, or create new organizations. | `admin` |\n| `members:read` | List organization members and view pending invitations. | `member` |\n| `members:write` | Invite new members, cancel pending invitations, update roles, or remove members. | `admin` |\n\nIn addition to OAuth scopes, Siglata evaluates your active organization membership in real time on every operation. If a user's role changes or membership is revoked, access is immediately blocked. Product MCP also requires a per-organization access tier (`testing` or `upgraded`); organizations with `revoked` status (missing rows auto-ensure `testing`) fail with `MCP_ACCESS_REVOKED`.\n\n## Tools & Operations Reference [#tools-reference]\n\n`tools/list` advertises exactly two tools, backed by [CallScript](https://www.callscript.dev/):\n\n- **`execute`** runs a script that batches management operations into one round trip. Calls run server-side and compose: a script can list files, then rename or move each result, and only the returned value crosses the wire.\n- **`search`** lists the operation signatures this grant may call, so a client discovers its callable set without probing.\n\n```js title=\"An execute script batching two operations\"\nconst trash = await files_list({ state: \"trash\" });\nconst storage = await storage_get({});\nreturn { trash, storage };\n```\n\nThe operations below are functions inside `execute` scripts — calling one directly by name through `tools/call` returns a JSON-RPC error with `error.code` `-32602` and `error.data.code` `USE_EXECUTE`, redirecting the caller to `execute`. An operation whose required scope or member role is missing is never mounted for the grant: `search` does not list it and a script naming it fails validation. `search` cards declare each operation's failure codes, and scripts containing `suspend` steps are rejected as `invalid` — write single-pass scripts.\n\nCall `search` for the signature card of every operation this grant may call — parameters, return shapes, and declared failure codes — filtered to the grant's scopes and role.\n\n### Files\n\n| Operation | Purpose |\n| :-- | :-- |\n| `files_list` | Lists active files or recoverable trash in the organization. |\n| `uploads_list` | Lists unfinished upload reservations so they can be resumed or cancelled. |\n| `storage_get` | Retrieves the organization's current storage metrics in bytes. |\n| `file_get` | Reads one file's metadata and lifecycle state. |\n| `folder_get` | Reads one folder's metadata and lifecycle state. |\n| `file_read` | Reads a file's bytes inline, or returns authenticated transfer instructions for larger files. |\n| `sheet_list` | Lists worksheets in a stored `.xlsx` without returning workbook bytes. |\n| `sheet_read` | Reads an A1 cell range from a stored `.xlsx` as JSON cells without returning workbook bytes. |\n| `sheet_write` | Patches one or more A1 ranges (`patches[]`) on an existing workbook, preserves cells outside those ranges and untouched sheets, and returns a new edition file id without returning workbook bytes. |\n| `relation_extract` | Extracts named relation tables from stored `.xlsx` workbooks, one outcome per requested section; `persist` stores each extracted section as a table in `rel_<org>` for `sql_query`. |\n| `attach_workbook` | Attaches every sheet of a stored `.xlsx` as a table in `rel_<org>` with `siglata.file-id` provenance; tables live as long as their source file. |\n| `sql_query` | Runs one SQL statement over this organization's `rel_<org>.<table>` tables, re-authorizing the source file of every referenced table; results cap at 10,000 rows. |\n| `relation_list` | Lists the `rel_<org>` tables this grant may read — persisted relations and attached workbook sheets — with qualified name, source file, sheet, and row count. |\n| `doc_list` | Counts body paragraphs in a stored `.docx` without returning document bytes. |\n| `doc_read` | Reads plain paragraph text from a stored `.docx` without returning document bytes. |\n| `pdf_list` | Counts pages in a stored PDF without returning document bytes. |\n| `pdf_read` | Reads plain page text from a stored PDF without returning document bytes. |\n| `ppt_list` | Lists slide indexes and title placeholders in a stored `.pptx` without returning archive bytes. |\n| `ppt_read` | Reads plain slide paragraph text and speaker `notes` from a stored `.pptx` without returning archive bytes. |\n| `file_download` | Obtains authenticated HTTP download instructions for a file. |\n| `file_write` | Creates a small file inline. |\n| `file_rename` | Renames a file without modifying or re-uploading its stored bytes. |\n| `file_set_visibility` | Sets a file's visibility to org-wide or restricted. |\n| `file_move` | Moves a file into a folder or back to the organization root. |\n| `file_copy` | Copies an active file into a folder or the organization root, charging storage quota for the full size. |\n| `file_trash` | Moves an active file to recoverable trash. |\n| `file_restore` | Restores a trashed file to active state. |\n| `file_purge` | Permanently deletes a trashed file and releases its storage quota. |\n| `upload_begin` | Reserves storage quota and initiates a multipart upload session. |\n| `upload_complete` | Finalizes an upload after all parts have been transferred. |\n| `upload_cancel` | Cancels an unfinished upload and frees its quota reservation. |\n\n### Folders & Access\n\n| Operation | Purpose |\n| :-- | :-- |\n| `folders_list` | Lists folders in the organization. |\n| `folder_create` | Creates a folder, optionally nested under a parent folder. |\n| `folder_rename` | Renames a folder without affecting its contents. |\n| `folder_set_visibility` | Sets a folder's visibility to org-wide or restricted. |\n| `folder_move` | Moves a folder under a new parent or back to the organization root. |\n| `folder_copy` | Deep-copies an active folder tree and returns the new root folder only. |\n| `folder_trash` | Moves a folder to recoverable trash. |\n| `folder_restore` | Restores a trashed folder before its recovery deadline. |\n| `folder_purge` | Permanently deletes a trashed folder. |\n| `grants_list` | Lists the explicit access grants on a file or folder. |\n| `grant_create` | Grants a member read or write access to a file or folder. |\n| `grant_revoke` | Revokes an access grant. |\n\n### Organization & Team\n\n| Operation | Purpose |\n| :-- | :-- |\n| `principal_get` | Reads the identity, role, and scopes bound to this grant. |\n| `organization_get` | Retrieves details for the selected organization. |\n| `organizations_list` | Lists organizations the authorizing user belongs to; `current` marks the grant-bound org without switching it. |\n| `organization_update` | Updates the name or slug of the selected organization. |\n| `organization_create` | Creates a new organization. |\n| `organization_delete` | Permanently deletes the selected organization and its files. Owner only. |\n| `members_list` | Lists team members in the organization with pagination. |\n| `member_update_role` | Changes a team member's role. |\n| `member_remove` | Removes a member from the organization. |\n| `invitation_create` | Invites a new member to the organization via email. |\n| `invitation_resend` | Resends a pending invitation email for the selected organization. |\n| `invitations_list` | Lists all pending invitations for the organization. |\n| `invitation_cancel` | Revokes an unaccepted invitation. |\n| `invitations_mine` | Lists pending invitations addressed to the authorizing user (may include other organizations). |\n| `invitation_accept` | Accepts a pending invitation for the grant-bound organization only. Does not rebind the OAuth grant; accepting another organization requires console accept and a new grant. |\n| `invitation_reject` | Rejects a pending invitation for the grant-bound organization only. Does not rebind the OAuth grant. |\n| `organization_leave` | Leaves the grant-bound organization. The next MCP call fails membership. |\n| `sessions_list` | Lists this principal's own live MCP grant sessions. |\n| `session_revoke` | Revokes one of your own MCP grant sessions. |\n\n## Resources [#resources]\n\nGrants holding `files:read` also see one resource template, `siglata:///files/{fileId}`, which resolves a file's bytes through `resources/read`. Textual media returns decoded text and other media returns base64 for files up to 1 MiB; larger files resolve to the same authenticated transfer instructions as `file_read`. The grant is re-checked on every read.\n\n### Watching files [#watching-files]\n\n`subscriptions/listen` on `siglata:///files/{fileId}` URIs opens a server-sent stream that emits `notifications/resources/updated` when a watched file changes. The stream honors up to 64 URIs; URIs outside the template, or any subscription on a grant without `files:read`, are rejected before the stream opens.\n\nThe first observation of each URI is a baseline and never emits. After that, one notification is emitted when a file's metadata changes, when it becomes unreadable to this grant (deleted, restricted, or its grant revoked), and when it becomes readable again. Identical or repeatedly-unreadable states stay silent — a notification means \"re-read the resource,\" never a diff of contents.\n\nEach watched URI is re-authorized on every evaluation under the grant that opened the stream: a file you can no longer read is indistinguishable from one that does not exist. File mutations push a best-effort hint to the watch hub for low latency; a periodic sweep re-checks every watcher so a dropped hint still surfaces. The stream ends when the client disconnects, when the grant stops resolving (revoked session, dropped membership), or at the earlier of the grant's expiry and one hour — clients re-listen to continue watching.\n\n## Install [#install]\n\nConnect over OAuth to `https://www.siglata.com/v1/mcp`. Client install steps live on dedicated pages (copy-paste commands for people and agents). Start at [Connect](/docs/en-US/agents/connect).\n\n- Proven (v1): [Cursor](/docs/en-US/agents/install/cursor), [Codex](/docs/en-US/agents/install/codex)\n- Installable / spec-compatible: [ChatGPT Desktop](/docs/en-US/agents/install/chatgpt-desktop), [Claude Desktop](/docs/en-US/agents/install/claude-desktop), [VS Code](/docs/en-US/agents/install/vs-code)\n\nThis page documents the MCP surface only (`execute`, `search`, CallScript operations, resources, scopes). It does not duplicate those install guides.\n\n## Security & Revocation [#security]\n\n- **Strict Multi-Tenancy**: An MCP grant grants access to exactly one organization. To access another workspace, authenticate an additional connection.\n- **Active State Validation**: Tokens are verified against database session records and active organization membership on each request.\n- **Revocation**: A grant stops working when its authorizing session ends or the member leaves the organization. Drop a connection in-band with `session_revoke`, revoke the session through `POST /auth/revoke-session`, or remove the member with `member_remove`; either way, the client's next request is rejected.\n\n## Changing scopes after authorization [#changing-scopes]\n\nScopes are chosen at consent and stored on the grant. There is no post-grant scope mutation API (`scopes_update` or similar), because widening scopes without reconsent would bypass the consent trust boundary. To change scopes, revoke the current grant with `session_revoke` (or revoke the session / leave the organization), then run OAuth again and approve the desired scope set at consent.\n\n## MCP Registry [#mcp-registry]\n\nThe server is listed on the official MCP Registry as [com.siglata/mcp](https://registry.modelcontextprotocol.io/v0.1/servers/com.siglata%2Fmcp/versions/latest)."},{"@type":"TechArticle","name":"Overview","description":"Sign in, organize the team, and connect an agent to Siglata.","url":"https://www.siglata.com/docs/en-US/","inLanguage":"en-US","text":"Siglata gives teams and AI agents access to files within an organization. Sign in with an email link, manage members and file permissions, and connect an agent through the Model Context Protocol (MCP). Each organization has its own files, storage quota, and access grants.\n\n[Open Siglata Console](https://www.siglata.com/app) to sign in and select your organization.\n\n## System Architecture [#system-architecture]\n\nThe platform has three main parts:\n\n- **File storage**: Upload files using 8 MiB fixed chunks, pre-allocated upload reservations, and an automated 30-day trash recovery lifecycle.\n- **Agent connections**: A Model Context Protocol (MCP) server over Streamable HTTP, protected by standard OAuth 2.0 grants and granular capability scopes.\n- **Web and API access**: Access your workspace through the web application, the standard HTTP API, or MCP-connected AI environments like Claude and Cursor.\n\n## Core Capabilities [#core-capabilities]\n\nUse Siglata to manage files and access for your team:\n\n- **Organizations**: Keep each team’s files and permissions separate. Manage members with `owner`, `admin`, and `member` roles, and invite collaborators through localized email invites.\n- **File storage**: Each organization starts with a 10 GiB storage quota. Upload large assets in multiple parts up to ~80 GB per file, rename objects with atomic metadata operations, and restore deleted files within 30 days.\n- **Model Context Protocol (MCP)**: Connect AI agents directly to your workspace. Grant scoped permissions for agents to inspect directories, upload outputs, download assets, and manage team workspaces.\n- **Folders and Access Grants**: Organize files into nested folders and restrict sensitive files or folders to their creator, organization administrators, and explicitly granted members.\n- **HTTP REST & Auth API**: Integrate custom services, webhooks, and backend systems with our RESTful endpoints and standard headers.\n\n## Quickstart Guide [#quickstart]\n\nFollow these four steps to start collaborating with your team and AI agents:\n\n### 1. Sign In to Your Workspace\n\nNavigate to the [Siglata Console](https://www.siglata.com/app), choose your preferred language, and enter your email address. You will receive a secure, one-time magic link. Click the link to authenticate immediately without managing passwords.\n\nRead more in [Sign in](/docs/en-US/sign-in).\n\n### 2. Configure Your Organization\n\nOnce signed in, create a new organization or accept a pending team invitation. Assign team roles (`owner`, `admin`, or `member`) to enforce least-privilege access across your workspaces.\n\nLearn more in [Organizations](/docs/en-US/workspace/organizations).\n\n### 3. Store and Manage Files\n\nUpload files through the MCP server and authenticated HTTP transfer endpoints. Siglata automatically validates sizes, reserves quota, and transfers files in 8 MiB chunks. You can restore deleted files from Trash for 30 days.\n\nExplore storage mechanics in [Files](/docs/en-US/workspace/files).\n\n### 4. Connect AI Agents via MCP\n\nAuthorize an MCP client against the Siglata endpoint (`https://www.siglata.com/v1/mcp`). Grant fine-grained read or write scopes per organization to let your tools collaborate safely.\n\nRead the MCP surface in [MCP](/docs/en-US/agents/mcp). To connect an app, open [Connect](/docs/en-US/agents/connect) (Cursor and Codex are proven for v1; other listed clients are installable / spec-compatible).\n\n## What to read next [#navigation]\n\nStart here, use the workspace, connect an agent, and look up the API when you need it.\n\n| Page | Outcome |\n| :-- | :-- |\n| [Sign in](/docs/en-US/sign-in) | Sign in with an email link. |\n| [Workspace](/docs/en-US/workspace) | Create the organization and manage files. |\n| [Agents](/docs/en-US/agents) | Connect the app and see MCP. |\n| [Reference](/docs/en-US/reference) | Look up the HTTP API. |"},{"@type":"TechArticle","name":"Public search with NLWeb","description":"Query Siglata's website and documentation in natural language, with cited JSON or SSE results.","url":"https://www.siglata.com/docs/en-US/nlweb","inLanguage":"en-US","text":"The `https://www.siglata.com/ask` endpoint searches Siglata's public pages and documentation. It returns relevant pages with a title, description, language and source URL. It requires no authentication and cannot access organization files.\n\n## Query\n\n```bash\ncurl https://www.siglata.com/ask \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":{\"text\":\"How does the pilot work?\",\"max_results\":5},\"prefer\":{\"mode\":\"list\",\"response_format\":\"conv_search\",\"streaming\":false,\"accept-language\":\"en-US\"}}'\n```\n\nYou can also use `GET /ask?query=spreadsheets&streaming=false&lang=en-US`. Portuguese is the default. For POST, set `prefer.accept-language`. The `Accept-Language` header applies when there is no explicit language preference.\n\nEach result includes `grounding.source_urls` pointing to its source page. Ranking uses Orama text search over published content. The `list` mode retrieves pages; it does not generate language-model answers or execute actions.\n\n## Responses and limits\n\n- JSON: `prefer.streaming: false` or the `Accept: application/json` header.\n- SSE: `prefer.streaming: true`; the response sends one `data:` event containing results and closes the connection. SSE is the default without a JSON preference.\n- Queries are limited to 1,000 characters, request bodies to 8 KiB and results to 20; the default is 5 results.\n- Queries without matches return `results: []`.\n- Invalid request: 400; unsupported method: 405; oversized body: 413; wrong content type: 415; unavailable search: 503.\n\nThis implementation uses the `list` / `conv_search` profile of the [NLWeb 0.54 models](https://github.com/nlweb-ai/nlweb-ask-agent/blob/main/ask_api/packages/core/nlweb_core/protocol/models.py). Summaries, conversation history, persistent memory, cross-site search and other response formats are unsupported. POST fields outside the documented profile are rejected.\n\n## Discovery\n\n- [NLWeb OpenAPI description](https://www.siglata.com/nlweb/openapi.json)\n- [Public Schema.org DataFeed](https://www.siglata.com/nlweb.json)\n- [Structured feed map](https://www.siglata.com/schemamap.xml)\n- [Public pages as JSON Lines](https://www.siglata.com/nlweb/feed.jsonl)\n- [Agent index](https://www.siglata.com/llms.txt)\n\nThe map follows the [Schema Feeds 0.1 proposal](https://github.com/nlweb-ai/website/blob/main/SCHEMA_SPEC.md), advertised in `robots.txt`. Each feed line contains one JSON-LD page with its language, text and source URL. Both formats are generated from the same public pages whenever the site is published.\n\nThe documentation also provides WebMCP for browser agents. The [organization MCP](/docs/en-US/agents/mcp) at `/v1/mcp` is separate: it requires OAuth and preserves file-access scopes."},{"@type":"TechArticle","name":"HTTP API","description":"Look up HTTP API headers, routes, status codes, and errors.","url":"https://www.siglata.com/docs/en-US/reference/api","inLanguage":"en-US","text":"The Siglata HTTP API exposes core workspace services, authentication flows, and data transfer pipelines. The API provides typed error handling, strict multi-tenant boundaries, and internationalization.\n\nThe default production base URL is:\n\n```text\nhttps://www.siglata.com\n```\n\n## Standard Headers [#standard-headers]\n\nAll requests to the Siglata API utilize standard HTTP headers:\n\n| Header | Description | Example |\n| :-- | :-- | :-- |\n| `Authorization` | Bearer token for authenticated API and MCP transfer requests. | `Bearer sig_acc_9f8a7...` |\n| `x-siglata-locale` | Preferred language for transactional emails, invitation templates, and localized error messages. | `en-US` or `pt-BR` |\n| `Content-Type` | Payload format. Defaults to `application/json` for control endpoints and `application/octet-stream` for binary file chunks. | `application/json` |\n| `Origin` | Validated on MCP and CORS endpoints to prevent cross-origin abuse. | `https://example.com` |\n\n## Core Service API [#core-api]\n\n### Service Health & Session Check\n\nInspect API availability, active localization, and current session identity.\n\n```http\nGET /api HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <optional-token>\nx-siglata-locale: en-US\n```\n\n#### Response (`200 OK`)\n\n```json\n{\n  \"service\": \"siglata\",\n  \"status\": \"ok\",\n  \"locale\": \"en-US\",\n  \"user\": {\n    \"id\": \"usr_9f8a7b6c5d\",\n    \"email\": \"alex@example.com\",\n    \"name\": \"Alex Smith\",\n    \"image\": null\n  }\n}\n```\n\nWhen called without an active session or token, `user` returns `null`.\n\n## Authentication Endpoints (`/auth/*`) [#auth-endpoints]\n\nAuthentication endpoints manage passwordless credentials, sessions, and multi-tenant organizations.\n\n### Request Magic Link\n\nSends a one-time sign-in link to the user's email address in their requested language.\n\n```http\nPOST /auth/sign-in/magic-link HTTP/1.1\nHost: www.siglata.com\nContent-Type: application/json\nx-siglata-locale: en-US\n\n{\n  \"email\": \"alex@example.com\"\n}\n```\n\n#### Response (`200 OK`)\n\n```json\n{\n  \"status\": true\n}\n```\n\n### Verify Magic Link\n\nVerifies a one-time magic link token and sets a secure, HTTP-only session cookie.\n\n```http\nGET /auth/magic-link/verify?token=tok_3b4c5d6e7f HTTP/1.1\nHost: www.siglata.com\n```\n\n### Get Active Session\n\nRetrieves the currently authenticated session and user record.\n\n```http\nGET /auth/get-session HTTP/1.1\nHost: www.siglata.com\n```\n\n### Sign Out\n\nInvalidates the active session and clears authentication cookies.\n\n```http\nPOST /auth/sign-out HTTP/1.1\nHost: www.siglata.com\n```\n\n### Organization Management\n\nManage multi-tenant workspace boundaries and roles:\n\n#### Create Organization\n\n`POST /auth/organization/create`\n\n- **Body**: `{ \"name\": \"Acme Corp\", \"slug\": \"acme-corp\" }`\n- **Response**: Created organization record with ID.\n\n#### List User Organizations\n\n`GET /auth/organization/list`\n\n- **Response**: Array of organizations the user belongs to, including roles.\n\n#### Get Organization Details\n\n`GET /auth/organization/get?organizationId=org_1a2b3c4d5e`\n\n- **Response**: Detailed organization profile, members, and metadata.\n\n#### Invite Team Member\n\n`POST /auth/organization/invite-member`\n\n- **Headers**: `x-siglata-locale: en-US` (or `pt-BR`)\n- **Body**: `{ \"email\": \"dev@example.com\", \"role\": \"member\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n- **Response**: Created invitation record.\n\n#### List Pending Invitations\n\n`GET /auth/organization/list-invitations?organizationId=org_1a2b3c4d5e`\n\n- **Response**: Array of pending invitations.\n\n#### Cancel Invitation\n\n`POST /auth/organization/cancel-invitation`\n\n- **Body**: `{ \"invitationId\": \"inv_9a8b7c6d5e\" }`\n\n#### Update Member Role\n\n`POST /auth/organization/update-member-role`\n\n- **Body**: `{ \"memberId\": \"usr_3c4d5e6f7g\", \"role\": \"admin\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n\n#### Remove Member\n\n`POST /auth/organization/remove-member`\n\n- **Body**: `{ \"memberIdOrEmail\": \"usr_3c4d5e6f7g\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n\n### OAuth 2.0 Discovery Endpoints\n\nSiglata publishes standard discovery documents for OAuth 2.0 and MCP clients:\n\n- `GET /.well-known/oauth-authorization-server`\n- `GET /.well-known/openid-configuration`\n- `GET /.well-known/oauth-protected-resource/v1/mcp`\n\n## Model Context Protocol & Transfer Endpoints (`/v1/mcp/*`) [#mcp-endpoints]\n\nThe `/v1/mcp/*` endpoints handle JSON-RPC protocol messages and high-throughput binary file transfers. `tools/list` exposes only two tools, `execute` and `search`, and management operations run inside `execute` scripts.\n\n### JSON-RPC Streamable HTTP\n\n```http\nPOST /v1/mcp HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <oauth-access-token>\nContent-Type: application/json\n\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"execute\",\n    \"arguments\": {\n      \"script\": \"return await files_list({ state: 'active', limit: 25 });\"\n    }\n  }\n}\n```\n\n### Upload Binary Chunk\n\nTransfers a single 8 MiB part for an active upload reservation created via `upload_begin`.\n\n```http\nPUT /v1/mcp/uploads/{uploadId}/parts/{partNumber} HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <oauth-access-token>\nContent-Type: application/octet-stream\n\n<raw binary bytes: exactly 8,388,608 bytes, or remaining bytes for final part>\n```\n\n- `partNumber`: 1-indexed integer (1 to 10,000).\n- Response: `200 OK` on successful chunk verification and storage.\n\n### Authenticated Binary Download\n\nStreams stored file bytes directly to the authorized caller.\n\n```http\nGET /v1/mcp/files/{fileId}/download HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <oauth-access-token>\n```\n\n- **Response**: `200 OK` with `Content-Type` matching original media type, `Content-Length`, and `Content-Disposition: attachment`.\n- Verifies active organization membership before initiating the stream.\n\n## HTTP Status Codes [#status-codes]\n\n| Status | Code | Meaning |\n| :-- | :-- | :-- |\n| `200` | OK | Request succeeded; response payload returned. |\n| `201` | Created | Resource created successfully (e.g. organization, invitation). |\n| `204` | No Content | Action completed successfully with no response body. |\n| `400` | Bad Request | Malformed payload, invalid schema, or part size mismatch. |\n| `401` | Unauthorized | Missing or invalid authentication token, or session expired. |\n| `403` | Forbidden | Insufficient OAuth scope, membership required, or origin disallowed. |\n| `404` | Not Found | Target file, upload, organization, or invitation does not exist. |\n| `409` | Conflict | Storage quota exceeded, or concurrent state collision. |\n| `410` | Gone | Upload reservation has expired or 30-day trash recovery window lapsed. |\n| `500` | Internal Error | Server-side execution exception. |\n\n## Error Taxonomy [#error-taxonomy]\n\nSiglata returns structured, typed errors with predictable machine-readable codes:\n\n```json\n{\n  \"code\": \"quota_exceeded\",\n  \"message\": \"Storage quota limit reached for this organization\"\n}\n```\n\n### Common Error Codes\n\n| Error Code | HTTP Status | Description |\n| :-- | :-- | :-- |\n| `invalid_input` | 400 | One or more parameters failed validation rules. |\n| `part_mismatch` | 400 | Chunk size does not match expected 8 MiB size. |\n| `upload_incomplete` | 400 | Attempted to complete upload with missing parts. |\n| `SESSION_EXPIRED` | 401 | Authorizing session has lapsed; re-authentication required. |\n| `INSUFFICIENT_SCOPE` | 403 | OAuth grant lacks the scope required for this operation, or the org's MCP `maxScopes` ceiling excludes it. |\n| `MCP_ACCESS_REVOKED` | 403 | Organization MCP access is `revoked`. Missing rows auto-ensure `testing`. |\n| `ORGANIZATION_MEMBERSHIP_REQUIRED` | 403 | User is not an active member of the requested organization. |\n| `ORGANIZATION_ADMIN_REQUIRED` | 403 | Operation requires `owner` or `admin` organizational privileges. |\n| `ORIGIN_NOT_ALLOWED` | 403 | Request origin rejected by CORS security policy. |\n| `not_found` | 404 | File, upload, or organization record not found. |\n| `INVITATION_NOT_FOUND` | 404 | Targeted invitation ID does not exist. |\n| `quota_exceeded` | 409 | Upload cannot proceed because it exceeds the 10 GiB limit. |\n| `conflict` | 409 | Concurrent modification or state conflict. |\n| `upload_expired` | 410 | Upload reservation expired before completion. |\n| `restore_expired` | 410 | File has passed the 30-day trash recovery window. |\n| `storage_failure` | 500 | Storage backend operation encountered an unexpected error. |\n| `database_failure` | 500 | Database query or transaction failure. |"},{"@type":"TechArticle","name":"Reference","description":"Look up HTTP API endpoints and errors.","url":"https://www.siglata.com/docs/en-US/reference/","inLanguage":"en-US","text":"Use this section for lookup. How-tos live in [Workspace](/docs/en-US/workspace) and [Agents](/docs/en-US/agents).\n\n| Page | Outcome |\n| :-- | :-- |\n| [HTTP API](/docs/en-US/reference/api) | Headers, routes, status codes, and errors. |"},{"@type":"TechArticle","name":"Sign in","description":"Sign in to Siglata with a single-use email link.","url":"https://www.siglata.com/docs/en-US/sign-in","inLanguage":"en-US","text":"Siglata sends a signed, single-use link to your email address. Open the link to sign in without a password.\n\n## The Magic Link Workflow [#workflow]\n\nTo sign in, request a link and open it from your email:\n\n```\n1. Enter Email ──> Request Magic Link (POST /auth/sign-in/magic-link)\n       │\n       ▼\n2. Siglata Generates Secure Token ──> Dispatches Localized Magic-Link Email\n       │\n       ▼\n3. Click Link in Email ──> Token Verified (GET /auth/magic-link/verify)\n       │\n       ▼\n4. HttpOnly Session Cookie Set ──> Directed to Organization Dashboard\n```\n\n1. **Access the Console**: Navigate to the [Siglata Console](https://www.siglata.com/app).\n2. **Select Language**: Choose your preferred language (`en-US` or `pt-BR`) using the language switcher.\n3. **Submit Email Address**: Enter your work or personal email address and request a sign-in link.\n4. **Open Email Link**: Check your inbox for the message from Siglata. Click the button or copy the link into your browser.\n5. **Session Established**: The server verifies the cryptographic token, marks it consumed, and sets a secure, encrypted HTTP-only session cookie.\n6. **Workspace Selection**: You land in your active organization dashboard, or can create a new organization if signing in for the first time.\n\n## Localized Email Delivery [#localization]\n\nSiglata provides complete internationalization across the authentication pipeline. When requesting a magic link, the client carries the user's selected locale in the callback URL, from which the language of the transactional email is derived:\n\n- **English (`en-US`)**: Receives transactional emails titled _\"Sign in to Siglata\"_ with English copy, button text, and security notices.\n- **Português (`pt-BR`)**: Receives transactional emails titled _\"Entre na sua conta do Siglata\"_ with Brazilian Portuguese copy and button labels.\n\nThe locale preference is preserved throughout your session and carried forward into subsequent team invitations and system notifications.\n\n## First-Time Users & Team Invitations [#first-time-users]\n\nNew and existing users sign in with the same email-link flow:\n\n- **New Accounts**: If your email has not been seen before, clicking the magic link creates your user record automatically. You will be prompted to create your first organization with a name and custom slug.\n- **Joining via Invitation**: If an administrator invited you to an existing workspace, opening the invitation link guides you through the magic-link sign-in. Once authenticated, your account is immediately joined as an active member of that organization with the pre-assigned role (`owner`, `admin`, or `member`).\n\n## Security Architecture & Best Practices [#security-architecture]\n\nSiglata enforces modern authentication standards:\n\n- **Short-Lived Tokens**: Magic link tokens expire automatically after **10 minutes**. Expired links return an explicit prompt to request a fresh token.\n- **Strict Single-Use Consumption**: Tokens are validated within an atomic database transaction. Once verified, the token is permanently invalidated, preventing replay attacks.\n- **HttpOnly & Secure Cookies**: Browser sessions are maintained using encrypted cookies marked `HttpOnly`, `Secure`, and `SameSite=Lax`. Session tokens cannot be accessed or extracted by client-side JavaScript, mitigating Cross-Site Scripting (XSS) risks.\n- **Zero Stored Passwords**: Because passwords are never used or stored, your account is immune to rainbow table attacks and credential database breaches.\n- **OAuth & MCP Compatibility**: Autonomous AI clients connecting through the Model Context Protocol (MCP) use the same underlying identity layer, authorizing access through standard OAuth 2.0 grants tied to your authenticated session.\n\n## Troubleshooting [#troubleshooting]\n\nIf you encounter difficulties signing in:\n\n- **Email Delivery Delays**: Check your spam or promotions folder. If the email has not arrived within two minutes, confirm your email address spelling and request a new link.\n- **Expired Token**: If you see a _\"Link Expired\"_ message, the 10-minute validity window elapsed before the link was clicked. Return to the sign-in page to generate a fresh link.\n- **Multiple Browsers or Devices**: For the smoothest experience, open the magic link in the same browser tab or device from which you initiated the sign-in request.\n- **Link Sharing**: Never forward magic links to colleagues. Magic links confer full access to your user account and organizations. To grant a teammate access, invite them with the `invitation_create` CallScript operation inside an MCP `execute` script or the `POST /auth/organization/invite-member` endpoint; see [Organizations](/docs/en-US/workspace/organizations)."},{"@type":"TechArticle","name":"Files","description":"Upload, organize, and recover organization files.","url":"https://www.siglata.com/docs/en-US/workspace/files","inLanguage":"en-US","text":"Every file in Siglata belongs to an organization. Files remain with the organization when its members change. The storage architecture incorporates pre-allocated upload reservations, fixed 8 MiB multipart chunking, atomic metadata operations, and an automated 30-day trash recovery lifecycle.\n\n## Storage Quota Architecture [#storage-quota]\n\nEach organization starts with a baseline storage quota of **10 GiB** (**10,737,418,240 bytes**).\n\nSiglata tracks storage through an atomic, transactional ledger that distinguishes between retained data and reserved upload capacity:\n\n```\n┌────────────────────────────────────────────────────────────────────────┐\n│                   Total Organization Quota (10 GiB)                    │\n├──────────────────────────────────────┬──────────────────┬──────────────┤\n│              Used Bytes              │  Reserved Bytes  │  Available   │\n│ (Active Files + 30-Day Trash Files)  │ (Active Uploads) │  Free Space  │\n└──────────────────────────────────────┴──────────────────┴──────────────┘\n```\n\n- **`limitBytes`**: Total storage capacity allocated to the organization (`10,737,418,240` bytes).\n- **`usedBytes`**: Retained storage across both **active files** and **files in trash**. Moving an item to trash does not free quota immediately; bytes remain accounted for until the 30-day recovery period lapses and cleanup purges the data.\n- **`reservedBytes`**: Storage locked by in-flight multipart uploads. When an upload begins, Siglata reserves the declared file size upfront to prevent concurrent uploads from colliding or exceeding organization limits.\n- **Available Space**: Calculated in real time as `limitBytes - usedBytes - reservedBytes`.\n\n## Multipart Chunking & Upload Reservations [#chunking-reservations]\n\nTo support massive files with high transfer reliability across unstable connections, Siglata uses a fixed 8 MiB chunking pipeline:\n\n| Parameter | Specification | Value |\n| :-- | :-- | :-- |\n| **Chunk Size (`CHUNK_SIZE`)** | Fixed part size | `8,388,608` bytes (8 MiB) |\n| **Maximum Part Count** | Maximum parts per upload | `10,000` parts |\n| **Maximum File Size (`MAX_FILE_BYTES`)** | Upper limit per single file | `83,886,080,000` bytes (~80 GB) |\n\n### The Upload Lifecycle\n\n```\n1. upload_begin ──> Check Quota ──> Pre-allocate reservedBytes ──> Return Upload ID & URL\n        │\n        ▼\n2. PUT /parts/{n} ──> Upload 8 MiB Chunks (Parallel or Sequential) ──> Record receivedParts\n        │\n        ▼\n3. upload_complete ──> Verify Part Count ──> Convert reservedBytes to usedBytes ──> File Active\n        │\n        └── (If Aborted) ──> upload_cancel ──> Delete Chunks ──> Release reservedBytes\n```\n\n1. **Upload Reservation (`upload_begin`)**:\n   - The client provides a unique `requestId` (UUID), `name`, `mediaType`, and `size`.\n   - Siglata verifies that `size <= (limitBytes - usedBytes - reservedBytes)`.\n   - The declared bytes are atomically added to `reservedBytes`, and an upload session is created with an expiration timestamp.\n   - The server returns an upload identifier and transfer instructions containing the HTTP `PUT` URL template.\n\n2. **Chunk Transmission (`PUT /v1/mcp/uploads/{uploadId}/parts/{partNumber}`)**:\n   - The client streams parts numbered sequentially from `1` to `N` (up to 10,000).\n   - Each part must be exactly `8,388,608` bytes, except for the final part which sends the remaining declared bytes.\n   - Parts can be uploaded concurrently. The server validates each chunk's length and records its arrival in the upload manifest.\n\n3. **Sealing & Activation (`upload_complete`)**:\n   - Once all parts have been received, the client calls `upload_complete`.\n   - The server verifies that every part from `1` to `N` is accounted for and that the total uploaded size matches the reservation.\n   - The upload record transitions to `completed`, the file is marked `active`, and the reserved capacity moves from `reservedBytes` into `usedBytes`.\n   - This operation is completely idempotent: retrying `upload_complete` with the same upload ID returns the active file record safely.\n\n4. **Cancellation & Expiration (`upload_cancel`)**:\n   - If an upload is cancelled by the user or client, `upload_cancel` triggers cleanup of any stored chunks and immediately releases the `reservedBytes`.\n   - If a client disconnects unexpectedly, background reconciliation automatically detects expired upload sessions, releases their reservations, and cleans up orphaned chunks.\n\n## 30-Day Trash & Recovery Lifecycle [#trash-recovery]\n\nSiglata implements a safety-first data retention model to protect teams against accidental file deletion:\n\n### Moving to Trash (`file_trash`)\n\nWhen a member deletes an active file:\n\n- The file's status transitions from `active` to `trash`.\n- The timestamp of deletion is recorded (`trashed_at = clock_timestamp()`).\n- The recovery deadline is set to exactly 30 days in the future:\n  ```sql\n  recover_until = clock_timestamp() + interval '30 days'\n  ```\n- The file disappears from the default files list but appears in the trash view (`files_list` with `state: \"trash\"`).\n- **Quota Accounting**: The file's bytes remain charged to the organization's `usedBytes`. This guarantees that the stored data is fully preserved and that restoring the file will never fail due to quota exhaustion.\n\n### Restoring Files (`file_restore`)\n\nIf a file was deleted accidentally:\n\n- Any member with `files:write` permissions can invoke `file_restore` at any point before `recover_until`.\n- The file atomically returns to `active` status, clearing `trashed_at` and `recover_until`.\n- Because the file's bytes were already accounted for in `usedBytes` while in trash, restoration consumes zero additional storage quota.\n\n### Automated Permanent Purge\n\n- Once the 30-day recovery deadline passes (`recover_until <= clock_timestamp()`), restoration is permanently disabled.\n- The Siglata background reconciliation worker queries for expired trash items in batches:\n  ```sql\n  SELECT id FROM files_object\n  WHERE state = 'trash' AND recover_until <= clock_timestamp()\n  ```\n- The worker marks the object for purging, deletes the stored binary blobs from the object storage tier, and cleans up the database record.\n- Only after binary deletion is confirmed are the file's bytes permanently subtracted from the organization's `usedBytes`, freeing up quota for new uploads.\n\n## Metadata Operations [#metadata-operations]\n\n### File Renaming (`file_rename`)\n\nRenaming a file in Siglata updates only the database record's `name` attribute. Because stored object blobs are addressed by immutable UUIDs, renaming is an instantaneous, zero-cost operation that requires no byte copying or quota adjustment.\n\n### Streaming Downloads (`file_download`)\n\nAuthorized members can download files directly via the authenticated download endpoint (`GET /v1/mcp/files/{fileId}/download`). The endpoint validates the caller's active organization membership in real time before streaming bytes, ensuring that revoked members or former collaborators cannot access organization assets.\n\n## Folders and Access Control [#folders-access]\n\nFiles can live in nested folders, and every file and folder carries a `visibility` flag:\n\n- **`org`** (default): Every organization member can read and write the object, subject to their OAuth scopes. This preserves the behavior of all files created before folders existed.\n- **`restricted`**: Only the object's creator, organization `owner`/`admin` members, and members holding an explicit grant can access the object.\n\nA restricted folder restricts its entire subtree: to read or write an object, the caller must satisfy every restricted folder in its ancestor chain. A grant on a folder extends to its unrestricted descendants, while a restricted object inside a shared folder still requires its own grant.\n\n- Denied operations fail with the `forbidden` error code; restricted objects a member cannot read are also omitted from `files_list` and `folders_list` results.\n- `grant_create` and `grant_revoke` are limited to the object's creator and organization administrators. To change a grant level or grantee, revoke then create (there is no separate replace operation).\n- `file_set_visibility` and `folder_set_visibility` require write access on the object; they do not change existing grants.\n- `file_move` and `upload_begin` into a folder require write access on the destination folder.\n- Trashing a folder does not trash its contents; when a trashed folder passes its recovery deadline, it is deleted and its children move to the organization root."},{"@type":"TechArticle","name":"Workspace","description":"Create an organization and manage the team's files.","url":"https://www.siglata.com/docs/en-US/workspace/","inLanguage":"en-US","text":"A Siglata workspace is the organization. Members, permissions, and files stay together.\n\n| Page | Outcome |\n| :-- | :-- |\n| [Organizations](/docs/en-US/workspace/organizations) | Create a team, invite members, and set roles. |\n| [Files](/docs/en-US/workspace/files) | Upload, organize, and recover organization files. |"},{"@type":"TechArticle","name":"Organizations","description":"Create a team, invite members, and set roles.","url":"https://www.siglata.com/docs/en-US/workspace/organizations","inLanguage":"en-US","text":"Siglata keeps files and access permissions within an organization. Every project asset — including files, upload reservations, storage quotas, member lists, invitations, and Model Context Protocol (MCP) grants — is partitioned by organization ID. A user can belong to multiple organizations and switch between them. Each organization retains its own data and permissions.\n\n## Multi-Tenant Architecture [#multi-tenant-architecture]\n\nIn Siglata, an **organization** is the foundational boundary for security and data retention:\n\n```\n┌────────────────────────────────────────────────────────────────────────┐\n│                          Siglata Account                               │\n│                         (alex@example.com)                             │\n└──────────────────────────────────┬─────────────────────────────────────┘\n                                   │\n         ┌─────────────────────────┴─────────────────────────┐\n         ▼                                                   ▼\n┌─────────────────────────────────┐         ┌─────────────────────────────────┐\n│     Acme Corp (org_1a2b3c)      │         │     Dev Studio (org_9z8y7x)     │\n├─────────────────────────────────┤         ├─────────────────────────────────┤\n│ • Role: Owner                   │         │ • Role: Member                  │\n│ • Quota: 10 GiB Dedicated       │         │ • Quota: 10 GiB Dedicated       │\n│ • Private Files & Trash View    │         │ • Private Files & Trash View    │\n│ • Distinct Members & Invites    │         │ • Distinct Members & Invites    │\n│ • Dedicated MCP OAuth Grants    │         │ • Dedicated MCP OAuth Grants    │\n└─────────────────────────────────┘         └─────────────────────────────────┘\n```\n\n- **Strict Data Partitioning**: All database queries and object storage paths include the `organizationId`. Cross-tenant data leakage is prevented at both the database schema and application layers.\n- **Independent Storage Quotas**: Each organization holds its own 10 GiB baseline quota (`limitBytes`), unaffected by file storage in other organizations.\n- **Scoped Integrations**: Connected MCP clients and OAuth grants bind strictly to one organization at a time. Product MCP additionally requires that organization to hold a access tier before tokens issue or tools run.\n\n## Role-Based Access Control (RBAC) [#rbac]\n\nSiglata provides three distinct organizational roles with enforced hierarchy and least-privilege principles:\n\n| Capability | `owner` | `admin` | `member` |\n| :-- | :-: | :-: | :-: |\n| **View, upload, download, and rename files** | ✓ | ✓ | ✓ |\n| **Move files to trash and restore within 30 days** | ✓ | ✓ | ✓ |\n| **Inspect organization storage metrics** | ✓ | ✓ | ✓ |\n| **Connect personal MCP clients** | ✓ | ✓ | ✓ |\n| **Invite new members and assign roles** | ✓ | ✓ | — |\n| **Cancel pending invitations** | ✓ | ✓ | — |\n| **Update member roles** | ✓ | ✓ | — |\n| **Remove members from organization** | ✓ | ✓ | — |\n| **Update organization name and URL slug** | ✓ | ✓ | — |\n| **Promote members to Owner or delete organization** | ✓ | — | — |\n\nOwners delete an organization with typed-name confirmation in the console, the CallScript operation `organization_delete` (empty input; grant-bound), or `POST /auth/organization/delete`. Deletion wipes the organization file plane first, then removes members, invitations, and the organization row.\n\n### Role Safeguards & Invariants\n\n- **Sole Owner Protection**: An organization must always have at least one active owner. A sole owner cannot be demoted or removed until another member is promoted to owner.\n- **Admin Delegation**: Administrators can invite members, assign member/admin roles, and remove collaborators, but cannot demote or remove existing owners.\n- **Real-Time Policy Evaluation**: Role checks (`requireRoleForScopes`) occur dynamically on every API request and MCP operation. Role changes take effect immediately without requiring users to log out.\n\n## Member Invitation Lifecycle [#invitation-lifecycle]\n\nInvite collaborators to your workspace securely using localized email invitations:\n\n```\n1. Admin sends invite ──> Localized invite email (en-US / pt-BR) ──> Token saved\n        │\n        ▼\n2. Recipient opens link ──> Passwordless magic link sign-in ──> Accept invite\n        │\n        ▼\n3. Member record created in DB ──> Workspace appears in switcher ──> Access active\n```\n\n### 1. Sending an Invitation\n\nAdministrators and owners can invite new team members with the `invitation_create` CallScript operation inside an MCP `execute` script or the `POST /auth/organization/invite-member` endpoint:\n\n- Specify the recipient's **email address**.\n- Select their assigned **role** (`owner`, `admin`, or `member`).\n- Select the **language preference** (`en-US` or `pt-BR`) via the `x-siglata-locale` header to ensure transactional emails are sent in the recipient's native language.\n\n### 2. Managing Pending Invitations\n\n- Outstanding invitations are returned by the `invitations_list` CallScript operation or `GET /auth/organization/list-invitations`.\n- Resend a pending invite with `invitation_resend` (same email and role as create).\n- List invitations addressed to you across organizations with `invitations_mine`.\n- Invitations remain valid for 7 days.\n- An admin can cancel a pending invitation at any time before acceptance (`invitation_cancel`), which immediately invalidates the invite token.\n\n### 3. Acceptance and Onboarding\n\n- The recipient clicks the secure link in their email, or uses grant-bound `invitation_accept` / `invitation_reject` when the invite targets the OAuth grant's organization.\n- Accept and reject refuse invitations for other organizations (`INVITATION_ORG_MISMATCH`); joining another org requires console accept and a new OAuth grant.\n- Leave the grant-bound organization with `organization_leave`; the next MCP call fails membership.\n- If they do not yet have a Siglata account, they authenticate immediately through a passwordless magic link — no password creation required.\n- Upon confirming the invitation, their user account is linked as an active member, and the organization appears in their workspace switcher.\n\n## Switching Workspaces [#switching-workspaces]\n\nUsers who belong to multiple organizations can switch contexts:\n\n- **Siglata Console**: During sign-in and MCP authorization, the organization selection step sets the active workspace.\n- **MCP AI Clients**: Each MCP connection grant is tied to a specific organization. Confirm the binding with the CallScript operation `principal_get` inside an `execute` script (`organizationId`, role, scopes); call `organization_get` when you need the name or slug. To connect an AI agent to multiple organizations, authorize separate server connections for each workspace.\n\n## Member Removal & Immediate Revocation [#revocation]\n\nWhen a member leaves a team or their access is revoked:\n\n1. An administrator removes the user with the `member_remove` CallScript operation or the `POST /auth/organization/remove-member` endpoint.\n2. The user's `member` record in the database is removed atomically.\n3. Any active MCP tokens held by that user for the organization are immediately rejected on their next call with:\n   ```json\n   {\n     \"code\": \"ORGANIZATION_MEMBERSHIP_REQUIRED\",\n     \"message\": \"Current organization membership is required\"\n   }\n   ```\n4. Authenticated binary file downloads and API requests are blocked immediately, ensuring zero unauthorized data retention."},{"@type":"TechArticle","name":"Visão geral","description":"Entre, organize a equipe e conecte um agente ao Siglata.","url":"https://www.siglata.com/docs/","inLanguage":"pt-BR","text":"O Siglata permite que equipes e agentes de IA acessem os arquivos de uma organização. Entre com um link por e-mail, gerencie membros e permissões e conecte um agente pelo Model Context Protocol (MCP). Cada organização tem seus próprios arquivos, cota de armazenamento e permissões de acesso.\n\n[Abrir Console Siglata](https://www.siglata.com/app) para entrar e selecionar sua organização.\n\n## Arquitetura do Sistema [#system-architecture]\n\nA plataforma tem três partes principais:\n\n- **Armazenamento de arquivos**: Envio de arquivos em blocos fixos de 8 MiB, pré-reserva dinâmica de cota e ciclo de vida automatizado de recuperação de lixeira de 30 dias.\n- **Conexões com agentes**: Servidor de Model Context Protocol (MCP) via Streamable HTTP, protegido por concessões OAuth 2.0 padrão e escopos granulares de capacidade.\n- **Acesso pela web e por API**: Acesse seu espaço de trabalho pelo aplicativo web, pela API HTTP padrão ou por ambientes de IA conectados ao MCP, como Claude e Cursor.\n\n## Capacidades Principais [#core-capabilities]\n\nUse o Siglata para gerenciar os arquivos e o acesso da sua equipe:\n\n- **Organizações**: Mantenha os arquivos e as permissões de cada equipe separados. Gerencie membros com as funções `owner`, `admin` e `member`, e convide colaboradores com e-mails localizados.\n- **Armazenamento de arquivos**: Cada organização inicia com uma cota de 10 GiB. Envie arquivos grandes com transferências em partes de até ~80 GB por arquivo, renomeie objetos com operações atômicas de metadados e restaure arquivos excluídos em até 30 dias.\n- **Model Context Protocol (MCP)**: Conecte agentes de IA diretamente ao seu espaço de trabalho. Conceda permissões delimitadas para que agentes inspecionem diretórios, enviem resultados, baixem ativos e gerenciem os ambientes de equipe.\n- **Pastas e Concessões de Acesso**: Organize arquivos em pastas aninhadas e restrinja arquivos ou pastas sensíveis ao criador, aos administradores da organização e a membros explicitamente autorizados.\n- **API HTTP REST e Autenticação**: Integre serviços personalizados, webhooks e sistemas de backend com nossos endpoints RESTful e cabeçalhos padrão.\n\n## Guia de Início Rápido [#quickstart]\n\nSiga estas quatro etapas para começar a colaborar com sua equipe e agentes de IA:\n\n### 1. Entre no Seu Espaço de Trabalho\n\nAcesse o [Console Siglata](https://www.siglata.com/app), escolha seu idioma preferido e informe seu endereço de e-mail. Você receberá um link mágico seguro de uso único. Clique no link para autenticar-se imediatamente sem a necessidade de senhas.\n\nSaiba mais em [Entrar](/docs/sign-in).\n\n### 2. Configure Sua Organização\n\nApós autenticar-se, crie uma nova organização ou aceite um convite de equipe pendente. Atribua funções (`owner`, `admin` ou `member`) para impor privilégios mínimos em todos os seus espaços de trabalho.\n\nSaiba mais em [Organizações](/docs/workspace/organizations).\n\n### 3. Armazene e Gerencie Arquivos\n\nEnvie arquivos pelo servidor MCP e pelos endpoints autenticados de transferência HTTP. O Siglata valida os tamanhos automaticamente, reserva a cota necessária e transfere os arquivos em blocos de 8 MiB. Você pode restaurar arquivos excluídos da lixeira por 30 dias.\n\nExplore o funcionamento em [Arquivos](/docs/workspace/files).\n\n### 4. Conecte Agentes de IA via MCP\n\nAutorize um cliente MCP no endpoint do Siglata (`https://www.siglata.com/v1/mcp`). Conceda escopos detalhados de leitura ou escrita por organização para definir o que suas ferramentas podem acessar.\n\nLeia a superfície MCP em [MCP](/docs/agents/mcp). Para conectar um app, abra [Conectar](/docs/agents/connect) (Cursor e Codex são comprovados na v1; os demais clientes listados são instaláveis / compatíveis com a especificação).\n\n## O que ler a seguir [#navigation]\n\nComece aqui, use o espaço de trabalho, conecte um agente e consulte a API quando precisar.\n\n| Página | Resultado |\n| :-- | :-- |\n| [Entrar](/docs/sign-in) | Entre com um link por e-mail. |\n| [Espaço de trabalho](/docs/workspace) | Crie a organização e gerencie arquivos. |\n| [Agentes](/docs/agents) | Conecte o app e veja o MCP. |\n| [Referência](/docs/reference) | Consulte a API HTTP. |"},{"@type":"TechArticle","name":"Busca pública com NLWeb","description":"Consulte o site e a documentação da Siglata em linguagem natural, com resultados e fontes em JSON ou SSE.","url":"https://www.siglata.com/docs/nlweb","inLanguage":"pt-BR","text":"O endpoint `https://www.siglata.com/ask` busca nas páginas públicas e na documentação da Siglata. Ele retorna páginas relevantes com título, descrição, idioma e URL da fonte. Não exige autenticação e não acessa arquivos de organizações.\n\n## Consultar\n\n```bash\ncurl https://www.siglata.com/ask \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":{\"text\":\"Como funciona o piloto?\",\"max_results\":5},\"prefer\":{\"mode\":\"list\",\"response_format\":\"conv_search\",\"streaming\":false,\"accept-language\":\"pt-BR\"}}'\n```\n\nTambém é possível usar `GET /ask?query=planilhas&streaming=false`. O parâmetro `lang=en-US` seleciona o conteúdo em inglês; o padrão é português. Em POST, use `prefer.accept-language`. O cabeçalho `Accept-Language` é usado quando não há preferência explícita.\n\nCada resultado inclui `grounding.source_urls` com a página que sustenta a resposta. A classificação usa busca textual com Orama sobre o conteúdo publicado. O modo `list` recupera páginas; não gera respostas com um modelo de linguagem nem executa ações.\n\n## Respostas e limites\n\n- JSON: `prefer.streaming: false` ou cabeçalho `Accept: application/json`.\n- SSE: `prefer.streaming: true`; a resposta contém um evento `data:` com os resultados e encerra a conexão. SSE é o padrão quando não há preferência por JSON.\n- Até 1.000 caracteres na consulta, 8 KiB no corpo e 20 resultados; o padrão é 5.\n- Consultas sem correspondências retornam `results: []`.\n- Requisição inválida: 400; método incompatível: 405; corpo grande: 413; tipo de conteúdo incorreto: 415; busca indisponível: 503.\n\nEsta implementação usa o perfil `list` / `conv_search` dos [modelos NLWeb 0.54](https://github.com/nlweb-ai/nlweb-ask-agent/blob/main/ask_api/packages/core/nlweb_core/protocol/models.py). Modos de resumo, histórico de conversa, memória persistente, busca em outros sites e formatos diferentes não são suportados. Campos de POST fora do perfil documentado são rejeitados.\n\n## Descoberta\n\n- [Descrição OpenAPI do NLWeb](https://www.siglata.com/nlweb/openapi.json)\n- [Catálogo público em Schema.org DataFeed](https://www.siglata.com/nlweb.json)\n- [Mapa dos feeds estruturados](https://www.siglata.com/schemamap.xml)\n- [Páginas públicas em JSON Lines](https://www.siglata.com/nlweb/feed.jsonl)\n- [Índice para agentes](https://www.siglata.com/llms.txt)\n\nO mapa segue a proposta [Schema Feeds 0.1](https://github.com/nlweb-ai/website/blob/main/SCHEMA_SPEC.md), anunciada em `robots.txt`. Cada linha do feed contém uma página em JSON-LD, com idioma, texto e URL da fonte. Os dois formatos são gerados das mesmas páginas públicas a cada publicação do site.\n\nA documentação também oferece WebMCP para agentes no navegador. O [MCP de organizações](/docs/agents/mcp) em `/v1/mcp` é uma interface separada: exige OAuth e mantém os escopos de acesso aos arquivos."},{"@type":"TechArticle","name":"API HTTP","description":"Consulte cabeçalhos, rotas, status e erros da API HTTP.","url":"https://www.siglata.com/docs/reference/api","inLanguage":"pt-BR","text":"A API HTTP do Siglata expõe serviços essenciais de espaço de trabalho, fluxos de autenticação e pipelines de transferência de dados. A API oferece tratamento de erros tipado, limites multi-inquilino rigorosos e suporte completo a internacionalização.\n\nA URL base padrão de produção é:\n\n```text\nhttps://www.siglata.com\n```\n\n## Cabeçalhos Padrão [#standard-headers]\n\nTodas as requisições para a API do Siglata utilizam cabeçalhos HTTP padronizados:\n\n| Cabeçalho | Descrição | Exemplo |\n| :-- | :-- | :-- |\n| `Authorization` | Token Bearer para requisições autenticadas da API e transferências MCP. | `Bearer sig_acc_9f8a7...` |\n| `x-siglata-locale` | Idioma de preferência para e-mails transacionais, modelos de convite e mensagens de erro localizadas. | `en-US` ou `pt-BR` |\n| `Content-Type` | Formato da carga útil. O padrão é `application/json` para endpoints de controle e `application/octet-stream` para blocos binários de arquivos. | `application/json` |\n| `Origin` | Validado nos endpoints do MCP e CORS para evitar abusos de origens cruzadas. | `https://exemplo.com` |\n\n## API do Serviço Principal [#core-api]\n\n### Verificação de Saúde e Sessão\n\nInspecione a disponibilidade da API, a localização ativa e a identidade da sessão atual.\n\n```http\nGET /api HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <token-opcional>\nx-siglata-locale: pt-BR\n```\n\n#### Resposta (`200 OK`)\n\n```json\n{\n  \"service\": \"siglata\",\n  \"status\": \"ok\",\n  \"locale\": \"pt-BR\",\n  \"user\": {\n    \"id\": \"usr_9f8a7b6c5d\",\n    \"email\": \"alex@exemplo.com\",\n    \"name\": \"Alex Smith\",\n    \"image\": null\n  }\n}\n```\n\nQuando chamado sem uma sessão ativa ou token, `user` retorna `null`.\n\n## Endpoints de Autenticação (`/auth/*`) [#auth-endpoints]\n\nOs endpoints de autenticação administram credenciais sem senha, sessões e organizações multi-inquilino.\n\n### Solicitar Link Mágico\n\nEnvia um link de acesso de uso único para o endereço de e-mail do usuário no idioma solicitado.\n\n```http\nPOST /auth/sign-in/magic-link HTTP/1.1\nHost: www.siglata.com\nContent-Type: application/json\nx-siglata-locale: pt-BR\n\n{\n  \"email\": \"alex@exemplo.com\"\n}\n```\n\n#### Resposta (`200 OK`)\n\n```json\n{\n  \"status\": true\n}\n```\n\n### Verificar Link Mágico\n\nValida o token do link mágico de uso único e define um cookie de sessão seguro e HTTP-only.\n\n```http\nGET /auth/magic-link/verify?token=tok_3b4c5d6e7f HTTP/1.1\nHost: www.siglata.com\n```\n\n### Obter Sessão Ativa\n\nRecupera a sessão atualmente autenticada e o registro do usuário.\n\n```http\nGET /auth/get-session HTTP/1.1\nHost: www.siglata.com\n```\n\n### Encerrar Sessão (Sign Out)\n\nInvalida a sessão ativa e remove os cookies de autenticação.\n\n```http\nPOST /auth/sign-out HTTP/1.1\nHost: www.siglata.com\n```\n\n### Gerenciamento de Organizações\n\nAdministre os limites e funções de espaços de trabalho multi-inquilino:\n\n#### Criar Organização\n\n`POST /auth/organization/create`\n\n- **Corpo**: `{ \"name\": \"Acme Corp\", \"slug\": \"acme-corp\" }`\n- **Resposta**: Registro da organização criada com seu ID.\n\n#### Listar Organizações do Usuário\n\n`GET /auth/organization/list`\n\n- **Resposta**: Lista de organizações às quais o usuário pertence, incluindo suas funções.\n\n#### Obter Detalhes da Organização\n\n`GET /auth/organization/get?organizationId=org_1a2b3c4d5e`\n\n- **Resposta**: Perfil detalhado da organização, membros e metadados.\n\n#### Convidar Membro da Equipe\n\n`POST /auth/organization/invite-member`\n\n- **Cabeçalhos**: `x-siglata-locale: pt-BR` (ou `en-US`)\n- **Corpo**: `{ \"email\": \"dev@exemplo.com\", \"role\": \"member\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n- **Resposta**: Registro do convite criado.\n\n#### Listar Convites Pendentes\n\n`GET /auth/organization/list-invitations?organizationId=org_1a2b3c4d5e`\n\n- **Resposta**: Lista de convites pendentes.\n\n#### Cancelar Convite\n\n`POST /auth/organization/cancel-invitation`\n\n- **Corpo**: `{ \"invitationId\": \"inv_9a8b7c6d5e\" }`\n\n#### Atualizar Função de Membro\n\n`POST /auth/organization/update-member-role`\n\n- **Corpo**: `{ \"memberId\": \"usr_3c4d5e6f7g\", \"role\": \"admin\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n\n#### Remover Membro\n\n`POST /auth/organization/remove-member`\n\n- **Corpo**: `{ \"memberIdOrEmail\": \"usr_3c4d5e6f7g\", \"organizationId\": \"org_1a2b3c4d5e\" }`\n\n### Endpoints de Descoberta OAuth 2.0\n\nO Siglata publica documentos de descoberta padrão para clientes OAuth 2.0 e MCP:\n\n- `GET /.well-known/oauth-authorization-server`\n- `GET /.well-known/openid-configuration`\n- `GET /.well-known/oauth-protected-resource/v1/mcp`\n\n## Endpoints do Model Context Protocol e Transferências (`/v1/mcp/*`) [#mcp-endpoints]\n\nOs endpoints `/v1/mcp/*` processam mensagens do protocolo JSON-RPC e transferências de arquivos binários de alto rendimento. O `tools/list` expõe apenas duas ferramentas, `execute` e `search`, e as operações de gerenciamento rodam dentro de scripts `execute`.\n\n### Streamable HTTP para JSON-RPC\n\n```http\nPOST /v1/mcp HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <token-de-acesso-oauth>\nContent-Type: application/json\n\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"execute\",\n    \"arguments\": {\n      \"script\": \"return await files_list({ state: 'active', limit: 25 });\"\n    }\n  }\n}\n```\n\n### Enviar Parte Binária (Upload de Bloco)\n\nTransfere uma parte individual de 8 MiB para uma reserva de upload ativa criada via `upload_begin`.\n\n```http\nPUT /v1/mcp/uploads/{uploadId}/parts/{partNumber} HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <token-de-acesso-oauth>\nContent-Type: application/octet-stream\n\n<bytes binários brutos: exatamente 8.388.608 bytes, ou os bytes restantes para a parte final>\n```\n\n- `partNumber`: Inteiro indexado a partir de 1 (de 1 a 10.000).\n- Resposta: `200 OK` mediante validação e gravação bem-sucedida do bloco.\n\n### Download Binário Autenticado\n\nTransmite os bytes do arquivo armazenado diretamente para o chamador autorizado.\n\n```http\nGET /v1/mcp/files/{fileId}/download HTTP/1.1\nHost: www.siglata.com\nAuthorization: Bearer <token-de-acesso-oauth>\n```\n\n- **Resposta**: `200 OK` com `Content-Type` correspondente ao tipo de mídia original, `Content-Length` e `Content-Disposition: attachment`.\n- Valida a associação ativa na organização antes de iniciar a transmissão dos bytes.\n\n## Códigos de Status HTTP [#status-codes]\n\n| Status | Código | Significado |\n| :-- | :-- | :-- |\n| `200` | OK | Requisição bem-sucedida; dados retornados. |\n| `201` | Created | Recurso criado com sucesso (por exemplo, organização, convite). |\n| `204` | No Content | Ação concluída com sucesso sem corpo de resposta. |\n| `400` | Bad Request | Carga malformada, esquema inválido ou divergência no tamanho do bloco. |\n| `401` | Unauthorized | Token de autenticação ausente ou inválido, ou sessão expirada. |\n| `403` | Forbidden | Escopo OAuth insuficiente, associação obrigatória ou origem não permitida. |\n| `404` | Not Found | Arquivo, upload, organização ou convite de destino não encontrado. |\n| `409` | Conflict | Cota de armazenamento excedida ou conflito de estado concorrente. |\n| `410` | Gone | A reserva de upload expirou ou a janela de 30 dias na lixeira terminou. |\n| `500` | Internal Error | Exceção na execução do lado do servidor. |\n\n## Taxonomia de Erros [#error-taxonomy]\n\nO Siglata retorna erros tipados e estruturados com códigos legíveis por máquina:\n\n```json\n{\n  \"code\": \"quota_exceeded\",\n  \"message\": \"Storage quota limit reached for this organization\"\n}\n```\n\n### Códigos de Erro Comuns\n\n| Código de Erro | Status HTTP | Descrição |\n| :-- | :-- | :-- |\n| `invalid_input` | 400 | Um ou mais parâmetros falharam nas regras de validação. |\n| `part_mismatch` | 400 | O tamanho da parte não corresponde aos 8 MiB esperados. |\n| `upload_incomplete` | 400 | Tentativa de concluir o upload com partes ausentes. |\n| `SESSION_EXPIRED` | 401 | A sessão autorizadora expirou; reautenticação obrigatória. |\n| `INSUFFICIENT_SCOPE` | 403 | A concessão OAuth não possui o escopo necessário para esta operação, ou o teto `maxScopes` MCP da organização o exclui. |\n| `MCP_ACCESS_REVOKED` | 403 | O acesso MCP da organização está `revoked`. Linhas ausentes passam a `testing` automaticamente. |\n| `ORGANIZATION_MEMBERSHIP_REQUIRED` | 403 | O usuário não é membro ativo da organização solicitada. |\n| `ORGANIZATION_ADMIN_REQUIRED` | 403 | A operação exige privilégios de `owner` ou `admin`. |\n| `ORIGIN_NOT_ALLOWED` | 403 | Origem da requisição rejeitada pela política de segurança CORS. |\n| `not_found` | 404 | Registro de arquivo, upload ou organização não encontrado. |\n| `INVITATION_NOT_FOUND` | 404 | O ID de convite informado não existe. |\n| `quota_exceeded` | 409 | O upload não pode prosseguir porque ultrapassaria o limite de 10 GiB. |\n| `conflict` | 409 | Modificação concorrente ou conflito de estado. |\n| `upload_expired` | 410 | A reserva de upload expirou antes da conclusão. |\n| `restore_expired` | 410 | O arquivo ultrapassou o período de recuperação de 30 dias da lixeira. |\n| `storage_failure` | 500 | O backend de armazenamento encontrou um erro inesperado. |\n| `database_failure` | 500 | Falha em consulta ou transação no banco de dados. |"},{"@type":"TechArticle","name":"Referência","description":"Consulte endpoints e erros da API HTTP.","url":"https://www.siglata.com/docs/reference/","inLanguage":"pt-BR","text":"Use esta seção para consulta. Os guias de uso ficam em [Espaço de trabalho](/docs/workspace) e [Agentes](/docs/agents).\n\n| Página                          | Resultado                          |\n| :------------------------------ | :--------------------------------- |\n| [API HTTP](/docs/reference/api) | Cabeçalhos, rotas, status e erros. |"},{"@type":"TechArticle","name":"Entrar","description":"Entre no Siglata com um link de uso único por e-mail.","url":"https://www.siglata.com/docs/sign-in","inLanguage":"pt-BR","text":"O Siglata envia um link assinado e de uso único para seu endereço de e-mail. Abra o link para entrar sem senha.\n\n## O Fluxo do Link Mágico [#workflow]\n\nPara entrar, solicite um link e abra a mensagem no seu e-mail:\n\n```\n1. Informar E-mail ──> Solicitar Link Mágico (POST /auth/sign-in/magic-link)\n       │\n       ▼\n2. Siglata Gera Token Seguro ──> Envia E-mail Localizado com Link Mágico\n       │\n       ▼\n3. Clicar no Link do E-mail ──> Token Validado (GET /auth/magic-link/verify)\n       │\n       ▼\n4. Cookie HttpOnly Definido ──> Redirecionado para o Painel da Organização\n```\n\n1. **Acesse o Console**: Navegue até o [Console Siglata](https://www.siglata.com/app).\n2. **Escolha o Idioma**: Selecione seu idioma de preferência (`pt-BR` ou `en-US`) usando o seletor de idioma.\n3. **Informe seu E-mail**: Digite seu e-mail corporativo ou pessoal e solicite o link de acesso.\n4. **Abra o Link no E-mail**: Verifique sua caixa de entrada e abra a mensagem enviada pelo Siglata. Clique no botão ou copie o link para o seu navegador.\n5. **Sessão Estabelecida**: O servidor valida o token criptográfico, marca-o como utilizado e define um cookie de sessão seguro, criptografado e HTTP-only.\n6. **Seleção de Espaço de Trabalho**: Você é direcionado ao painel da sua organização ativa, ou pode criar uma nova organização caso esteja entrando pela primeira vez.\n\n## Entrega de E-mails Localizada [#localization]\n\nO Siglata oferece suporte completo a internacionalização em todo o fluxo de autenticação. Ao solicitar um link mágico, o cliente carrega o idioma selecionado pelo usuário na URL de retorno, a partir da qual o idioma do e-mail transacional é derivado:\n\n- **Português (`pt-BR`)**: Recebe e-mails transacionais com o assunto _\"Entre na sua conta do Siglata\"_, texto em português do Brasil, botões e avisos de segurança no idioma.\n- **Inglês (`en-US`)**: Recebe e-mails transacionais com o assunto _\"Sign in to Siglata\"_ e todo o conteúdo em inglês.\n\nA preferência de idioma é preservada durante toda a sua sessão e estendida para futuros convites de equipe e notificações do sistema.\n\n## Novos Usuários e Convites de Equipe [#first-time-users]\n\nQuem já tem conta e quem está se cadastrando entra pelo mesmo fluxo de link por e-mail:\n\n- **Novas Contas**: Caso seu e-mail ainda não conste no sistema, clicar no link mágico cria seu cadastro automaticamente. Você será orientado a criar sua primeira organização, definindo nome e slug personalizado.\n- **Entrar por Convite**: Se um administrador o tiver convidado para um espaço de trabalho existente, o link do convite o direcionará para o login com link mágico. Após autenticar-se, sua conta é associada instantaneamente como membro ativo da organização com a função predefinida (`owner`, `admin` ou `member`).\n\n## Arquitetura de Segurança e Boas Práticas [#security-architecture]\n\nO Siglata aplica os mais rigorosos padrões de segurança:\n\n- **Tokens de Curta Duração**: Os links mágicos expiram automaticamente após **10 minutos**. Links expirados exibem uma mensagem orientando a solicitação de um novo link.\n- **Uso Único e Estrito**: Os tokens são validados em transações atômicas no banco de dados. Uma vez utilizados, são invalidados permanentemente, impedindo ataques de repetição (replay attacks).\n- **Cookies Seguros e HttpOnly**: As sessões do navegador são mantidas por meio de cookies criptografados com as propriedades `HttpOnly`, `Secure` e `SameSite=Lax`. Tokens de sessão não podem ser acessados ou extraídos por scripts no navegador, mitigando riscos de Cross-Site Scripting (XSS).\n- **Sem Armazenamento de Senhas**: Como senhas nunca são criadas ou guardadas, sua conta fica imune a vazamentos de credenciais e ataques de rainbow table.\n- **Compatibilidade com OAuth e MCP**: Agentes autônomos de IA que se conectam via Model Context Protocol (MCP) utilizam a mesma camada de identidade, autorizando o acesso por concessões padrão do OAuth 2.0 associadas à sua sessão autenticada.\n\n## Resolução de Problemas [#troubleshooting]\n\nCaso encontre dificuldades para entrar na sua conta:\n\n- **Atraso na Chegada do E-mail**: Verifique a pasta de spam ou promoções. Se a mensagem não chegar em dois minutos, confirme a digitação do e-mail e solicite um novo link.\n- **Link Expirado**: Se visualizar o aviso de link expirado, o prazo de 10 minutos foi ultrapassado antes do clique. Retorne à página inicial e gere um novo link.\n- **Múltiplos Navegadores ou Dispositivos**: Para uma experiência ideal, abra o link mágico no mesmo navegador ou dispositivo onde solicitou o acesso.\n- **Compartilhamento de Links**: Nunca encaminhe links mágicos para outras pessoas. Eles conferem acesso total à sua conta e organizações. Para conceder acesso a colegas, convide-os pela operação CallScript `invitation_create` dentro de um script MCP `execute` ou pelo endpoint `POST /auth/organization/invite-member`; veja [Organizações](/docs/workspace/organizations)."},{"@type":"TechArticle","name":"Arquivos","description":"Envie, organize e recupere arquivos da organização.","url":"https://www.siglata.com/docs/workspace/files","inLanguage":"pt-BR","text":"Cada arquivo no Siglata pertence a uma organização. Os arquivos permanecem na organização quando seus membros mudam. A arquitetura de armazenamento incorpora pré-reservas de upload, particionamento fixo em partes de 8 MiB, operações atômicas de metadados e um ciclo de vida automatizado de recuperação na lixeira por 30 dias.\n\n## Arquitetura da Cota de Armazenamento [#storage-quota]\n\nCada organização inicia com uma cota de armazenamento base de **10 GiB** (**10.737.418.240 bytes**).\n\nO Siglata monitora o armazenamento por meio de um livro-razão transacional atômico que distingue entre dados retidos e capacidade pré-alocada de upload:\n\n```\n┌────────────────────────────────────────────────────────────────────────┐\n│                   Cota Total da Organização (10 GiB)                   │\n├──────────────────────────────────────┬──────────────────┬──────────────┤\n│             Bytes Usados             │ Bytes Reservados │    Espaço    │\n│  (Arquivos Ativos + Lixeira 30 Dias) │(Uploads Ativos)  │ Livre Dispon.│\n└──────────────────────────────────────┴──────────────────┴──────────────┘\n```\n\n- **`limitBytes`**: Capacidade total de armazenamento alocada para a organização (`10.737.418.240` bytes).\n- **`usedBytes`**: Armazenamento retido, somando tanto **arquivos ativos** quanto **arquivos na lixeira**. Mover um item para a lixeira não libera a cota imediatamente; os bytes permanecem contabilizados até que o período de recuperação de 30 dias expire e a limpeza purgue os dados.\n- **`reservedBytes`**: Armazenamento bloqueado por uploads em partes em andamento. Ao iniciar um upload, o Siglata pré-aloca o tamanho total declarado do arquivo para evitar que uploads concorrentes colidam ou ultrapassem os limites da organização.\n- **Espaço Disponível**: Calculado em tempo real como `limitBytes - usedBytes - reservedBytes`.\n\n## Particionamento em Partes e Reservas de Upload [#chunking-reservations]\n\nPara suportar arquivos volumosos com alta confiabilidade de transferência mesmo em conexões instáveis, o Siglata utiliza um pipeline com blocos fixos de 8 MiB:\n\n| Parâmetro | Especificação | Valor |\n| :-- | :-- | :-- |\n| **Tamanho da Parte (`CHUNK_SIZE`)** | Tamanho fixo do bloco | `8.388.608` bytes (8 MiB) |\n| **Contagem Máxima de Partes** | Máximo de blocos por upload | `10.000` partes |\n| **Tamanho Máximo do Arquivo (`MAX_FILE_BYTES`)** | Limite superior para arquivo único | `83.886.080.000` bytes (~80 GB) |\n\n### O Ciclo de Vida do Upload\n\n```\n1. upload_begin ──> Checa Cota ──> Pré-aloca reservedBytes ──> Retorna ID e URL do Upload\n        │\n        ▼\n2. PUT /parts/{n} ──> Envia Blocos de 8 MiB (Paralelo ou Sequencial) ──> Registra receivedParts\n        │\n        ▼\n3. upload_complete ──> Valida Contagem ──> Converte reservedBytes em usedBytes ──> Arquivo Ativo\n        │\n        └── (Se Abortado) ──> upload_cancel ──> Exclui Blocos ──> Libera reservedBytes\n```\n\n1. **Reserva de Upload (`upload_begin`)**:\n   - O cliente fornece um `requestId` exclusivo (UUID), `name`, `mediaType` e `size`.\n   - O Siglata valida se `size <= (limitBytes - usedBytes - reservedBytes)`.\n   - Os bytes declarados são adicionados atomicamente a `reservedBytes`, e uma sessão de upload é criada com prazo de expiração.\n   - O servidor retorna o identificador do upload e as instruções de transferência com o modelo de URL HTTP `PUT`.\n\n2. **Transmissão das Partes (`PUT /v1/mcp/uploads/{uploadId}/parts/{partNumber}`)**:\n   - O cliente envia partes numeradas sequencialmente de `1` a `N` (até 10.000).\n   - Cada parte deve ter exatamente `8.388.608` bytes, com exceção da parte final, que envia os bytes restantes declarados.\n   - As partes podem ser enviadas em paralelo. O servidor valida o tamanho de cada bloco e registra a chegada no manifesto do upload.\n\n3. **Finalização e Ativação (`upload_complete`)**:\n   - Quando todas as partes forem recebidas, o cliente invoca `upload_complete`.\n   - O servidor confirma que todas as partes de `1` a `N` foram registradas e que o tamanho total coincide com a reserva.\n   - O registro do upload transiciona para `completed`, o arquivo é marcado como `active` e a capacidade reservada é transferida de `reservedBytes` para `usedBytes`.\n   - Essa operação é totalmente idempotente: repetir `upload_complete` com o mesmo ID retorna o arquivo ativo com segurança.\n\n4. **Cancelamento e Expiração (`upload_cancel`)**:\n   - Se o upload for cancelado pelo usuário ou cliente, `upload_cancel` aciona a exclusão dos blocos armazenados e libera imediatamente os `reservedBytes`.\n   - Se o cliente desconectar inesperadamente, o reconciliador em segundo plano detecta sessões de upload expiradas, cancela a reserva e limpa os blocos órfãos.\n\n## Ciclo de Vida de 30 Dias na Lixeira e Recuperação [#trash-recovery]\n\nO Siglata adota um modelo de retenção com foco na segurança dos dados para proteger equipes contra exclusões acidentais:\n\n### Mover para a Lixeira (`file_trash`)\n\nQuando um membro exclui um arquivo ativo:\n\n- O estado do arquivo transiciona de `active` para `trash`.\n- A data e hora da exclusão são registradas (`trashed_at = clock_timestamp()`).\n- O prazo limite de recuperação é estabelecido para exatamente 30 dias no futuro:\n  ```sql\n  recover_until = clock_timestamp() + interval '30 days'\n  ```\n- O arquivo deixa de aparecer na listagem padrão, mas passa a ser exibido na lixeira (`files_list` com `state: \"trash\"`).\n- **Contabilização na Cota**: Os bytes do arquivo continuam sendo cobrados do `usedBytes` da organização. Isso assegura que os dados permaneçam preservados e que a restauração futura nunca falhe por esgotamento de cota.\n\n### Restaurar Arquivos (`file_restore`)\n\nCaso um arquivo tenha sido excluído por engano:\n\n- Qualquer membro com permissão `files:write` pode chamar `file_restore` a qualquer momento antes de `recover_until`.\n- O arquivo retorna atomicamente ao status `active`, limpando `trashed_at` e `recover_until`.\n- Como os bytes do arquivo já estavam contabilizados em `usedBytes` durante a permanência na lixeira, a restauração não consome cota adicional.\n\n### Limpeza Permanente Automatizada\n\n- Após o encerramento do prazo de 30 dias (`recover_until <= clock_timestamp()`), a restauração é desabilitada permanentemente.\n- O reconciliador em segundo plano do Siglata busca os itens expirados na lixeira em lotes:\n  ```sql\n  SELECT id FROM files_object\n  WHERE state = 'trash' AND recover_until <= clock_timestamp()\n  ```\n- O processo marca o objeto para purga, remove os dados binários do armazenamento e limpa o registro correspondente no banco de dados.\n- Somente após a confirmação da exclusão física os bytes são subtraídos do `usedBytes` da organização, liberando espaço para novos envios.\n\n## Operações de Metadados [#metadata-operations]\n\n### Renomear Arquivo (`file_rename`)\n\nA renomeação de um arquivo no Siglata altera apenas o atributo `name` no registro do banco de dados. Como os objetos são endereçados por UUIDs imutáveis, a renomeação é uma operação instantânea de custo zero, sem cópia de dados ou recálculo de cota.\n\n### Downloads Autenticados em Fluxo (`file_download`)\n\nMembros autorizados podem baixar arquivos diretamente pelo endpoint de download autenticado (`GET /v1/mcp/files/{fileId}/download`). O endpoint valida a associação ativa do chamador na organização em tempo real antes de iniciar o fluxo de bytes, garantindo que ex-membros não acessem os ativos da organização.\n\n## Pastas e Controle de Acesso [#folders-access]\n\nArquivos podem residir em pastas aninhadas, e cada arquivo e pasta carrega um atributo `visibility`:\n\n- **`org`** (padrão): Todo membro da organização pode ler e gravar o objeto, sujeito aos seus escopos OAuth. Isso preserva o comportamento de todos os arquivos criados antes da existência de pastas.\n- **`restricted`**: Somente o criador do objeto, membros `owner`/`admin` da organização e membros com concessão explícita podem acessar o objeto.\n\nUma pasta restrita restringe toda a sua subárvore: para ler ou gravar um objeto, o chamador precisa satisfazer cada pasta restrita na cadeia de ancestrais. Uma concessão em uma pasta se estende aos seus descendentes irrestritos, enquanto um objeto restrito dentro de uma pasta compartilhada ainda exige sua própria concessão.\n\n- Operações negadas falham com o código de erro `forbidden`; objetos restritos que um membro não pode ler também são omitidos dos resultados de `files_list` e `folders_list`.\n- `grant_create` e `grant_revoke` são limitados ao criador do objeto e a administradores da organização. Para alterar o nível ou o beneficiário de uma concessão, revogue e depois crie (não há operação de substituição separada).\n- `file_set_visibility` e `folder_set_visibility` exigem acesso de escrita ao objeto; não alteram concessões existentes.\n- `file_move` e `upload_begin` em uma pasta requerem acesso de escrita à pasta de destino.\n- Mover uma pasta para a lixeira não move seu conteúdo; quando uma pasta na lixeira ultrapassa o prazo de recuperação, ela é excluída e seus filhos voltam para a raiz da organização."},{"@type":"TechArticle","name":"Espaço de trabalho","description":"Crie uma organização e gerencie os arquivos da equipe.","url":"https://www.siglata.com/docs/workspace/","inLanguage":"pt-BR","text":"O espaço de trabalho do Siglata é a organização. Membros, permissões e arquivos ficam juntos.\n\n| Página | Resultado |\n| :-- | :-- |\n| [Organizações](/docs/workspace/organizations) | Crie uma equipe, convide membros e defina funções. |\n| [Arquivos](/docs/workspace/files) | Envie, organize e recupere arquivos da organização. |"},{"@type":"TechArticle","name":"Organizações","description":"Crie uma equipe, convide membros e defina funções.","url":"https://www.siglata.com/docs/workspace/organizations","inLanguage":"pt-BR","text":"O Siglata organiza arquivos e permissões de acesso por organização. Todos os ativos de um projeto — incluindo arquivos, reservas de upload, cotas de armazenamento, listas de membros, convites e concessões do Model Context Protocol (MCP) — são particionados pelo identificador da organização. Um usuário pode pertencer a múltiplas organizações e alternar entre elas. Cada organização mantém seus próprios dados e permissões.\n\n## Arquitetura Multi-Inquilino [#multi-tenant-architecture]\n\nNo Siglata, uma **organização** é o limite fundamental de segurança e retenção de dados:\n\n```\n┌────────────────────────────────────────────────────────────────────────┐\n│                           Conta Siglata                                │\n│                         (alex@exemplo.com)                             │\n└──────────────────────────────────┬─────────────────────────────────────┘\n                                   │\n         ┌─────────────────────────┴─────────────────────────┐\n         ▼                                                   ▼\n┌─────────────────────────────────┐         ┌─────────────────────────────────┐\n│     Acme Corp (org_1a2b3c)      │         │     Dev Studio (org_9z8y7x)     │\n├─────────────────────────────────┤         ├─────────────────────────────────┤\n│ • Função: Proprietário (Owner)  │         │ • Função: Membro (Member)       │\n│ • Cota: 10 GiB Dedicada         │         │ • Cota: 10 GiB Dedicada         │\n│ • Arquivos Privados e Lixeira   │         │ • Arquivos Privados e Lixeira   │\n│ • Membros e Convites Próprios   │         │ • Membros e Convites Próprios   │\n│ • Concessões OAuth MCP Próprias │         │ • Concessões OAuth MCP Próprias │\n└─────────────────────────────────┘         └─────────────────────────────────┘\n```\n\n- **Particionamento Estrito de Dados**: Todas as consultas ao banco de dados e caminhos de armazenamento de objetos incluem o `organizationId`. O vazamento de dados entre inquilinos é impedido tanto no esquema do banco quanto nas camadas de aplicação.\n- **Cotas de Armazenamento Independentes**: Cada organização possui sua própria cota base de 10 GiB (`limitBytes`), que não é afetada pelo armazenamento de arquivos em outras organizações.\n- **Integrações Delimitadas**: Clientes MCP conectados e concessões OAuth vinculam-se estritamente a uma organização por vez. O MCP de produto também exige entitlement de piloto nessa organização antes de emitir tokens ou executar ferramentas.\n\n## Controle de Acesso Baseado em Funções (RBAC) [#rbac]\n\nO Siglata define três funções organizacionais com hierarquia rígida e fundamentadas no princípio do menor privilégio:\n\n| Capacidade | `owner` | `admin` | `member` |\n| :-- | :-: | :-: | :-: |\n| **Visualizar, enviar, baixar e renomear arquivos** | ✓ | ✓ | ✓ |\n| **Mover arquivos para lixeira e restaurar em 30 dias** | ✓ | ✓ | ✓ |\n| **Consultar métricas de armazenamento da organização** | ✓ | ✓ | ✓ |\n| **Conectar clientes MCP pessoais** | ✓ | ✓ | ✓ |\n| **Convidar novos membros e atribuir funções** | ✓ | ✓ | — |\n| **Cancelar convites pendentes** | ✓ | ✓ | — |\n| **Atualizar funções de membros** | ✓ | ✓ | — |\n| **Remover membros da organização** | ✓ | ✓ | — |\n| **Atualizar nome e slug de URL da organização** | ✓ | ✓ | — |\n| **Promover membros a Proprietário ou excluir organização** | ✓ | — | — |\n\nProprietários excluem uma organização com confirmação pelo nome no console, a operação CallScript `organization_delete` (entrada vazia; ligada ao grant) ou `POST /auth/organization/delete`. A exclusão limpa o plano de arquivos da organização antes de remover membros, convites e a linha da organização.\n\n### Proteções e Invariantes de Função\n\n- **Proteção ao Proprietário Exclusivo**: Uma organização deve sempre possuir pelo menos um proprietário ativo. Um proprietário exclusivo não pode ser rebaixado ou removido até que outro membro seja promovido a proprietário.\n- **Delegação de Administradores**: Administradores podem convidar membros, atribuir funções de membro/administrador e remover colaboradores, mas não podem rebaixar ou remover proprietários existentes.\n- **Validação de Políticas em Tempo Real**: As verificações de função (`requireRoleForScopes`) ocorrem dinamicamente a cada requisição de API e operação MCP. Mudanças de função surtem efeito imediato sem exigir que os usuários saiam da sessão.\n\n## Ciclo de Vida de Convite de Membros [#invitation-lifecycle]\n\nConvide colaboradores para o seu espaço de trabalho com segurança por meio de convites por e-mail localizados:\n\n```\n1. Admin envia convite ──> E-mail de convite localizado (pt-BR / en-US) ──> Token salvo\n        │\n        ▼\n2. Destinatário abre link ──> Login com link mágico sem senha ──> Aceita convite\n        │\n        ▼\n3. Registro de membro criado ──> Organização surge no seletor ──> Acesso ativo\n```\n\n### 1. Enviar um Convite\n\nAdministradores e proprietários podem convidar novos membros da equipe pela operação CallScript `invitation_create` dentro de um script MCP `execute` ou pelo endpoint `POST /auth/organization/invite-member`:\n\n- Informe o **endereço de e-mail** do destinatário.\n- Escolha a **função** a ser atribuída (`owner`, `admin` ou `member`).\n- Escolha a **preferência de idioma** (`pt-BR` ou `en-US`) pelo cabeçalho `x-siglata-locale` para garantir que os e-mails transacionais sejam entregues no idioma nativo do destinatário.\n\n### 2. Gerenciar Convites Pendentes\n\n- Convites pendentes são retornados pela operação CallScript `invitations_list` ou por `GET /auth/organization/list-invitations`.\n- Reenvie um convite pendente com `invitation_resend` (mesmo e-mail e função do create).\n- Liste convites endereçados a você em outras organizações com `invitations_mine`.\n- Os convites permanecem válidos por 7 dias.\n- Um administrador pode cancelar um convite pendente a qualquer momento antes da aceitação (`invitation_cancel`), o que invalida imediatamente o token correspondente.\n\n### 3. Aceitação e Integração\n\n- O destinatário clica no link seguro contido no e-mail, ou usa `invitation_accept` / `invitation_reject` vinculados à concessão quando o convite é da organização da concessão OAuth.\n- Aceitar e rejeitar recusam convites de outras organizações (`INVITATION_ORG_MISMATCH`); entrar em outra organização exige aceite no console e uma nova concessão OAuth.\n- Saia da organização vinculada à concessão com `organization_leave`; a próxima chamada MCP falha por falta de associação.\n- Caso ainda não possua uma conta no Siglata, ele se autentica instantaneamente por meio de um link mágico sem senha — nenhuma criação de senha é exigida.\n- Ao confirmar o convite, sua conta é vinculada como membro ativo e a organização passa a ser exibida no seletor de espaços de trabalho.\n\n## Alternar Espaços de Trabalho [#switching-workspaces]\n\nUsuários que pertencem a múltiplas organizações podem alternar de contexto:\n\n- **Console Siglata**: Durante o login e a autorização MCP, a etapa de seleção da organização define o espaço de trabalho ativo.\n- **Clientes de IA via MCP**: Cada concessão de conexão MCP vincula-se a uma organização específica. Confirme o vínculo com a operação CallScript `principal_get` dentro de um script `execute` (`organizationId`, função, escopos); chame `organization_get` quando precisar do nome ou do slug. Para conectar um agente de IA a múltiplas organizações, autorize conexões de servidor individuais para cada espaço de trabalho.\n\n## Remoção de Membro e Revogação Imediata [#revocation]\n\nQuando um colaborador deixa a equipe ou seu acesso é revogado:\n\n1. Um administrador remove o usuário pela operação CallScript `member_remove` ou pelo endpoint `POST /auth/organization/remove-member`.\n2. O registro de `member` do usuário no banco de dados é excluído atomicamente.\n3. Qualquer token MCP ativo detido por esse usuário para a organização é rejeitado na próxima chamada com:\n   ```json\n   {\n     \"code\": \"ORGANIZATION_MEMBERSHIP_REQUIRED\",\n     \"message\": \"Current organization membership is required\"\n   }\n   ```\n4. Downloads binários autenticados e requisições à API são bloqueados de imediato, garantindo que não haja retenção indevida de dados. [Conecte um cliente MCP](/docs/agents/mcp) ou [gerencie arquivos](/docs/workspace/files)."}]}