Skip to main content
Glama
cmacdonald0514

glean-company-docs

Halcyon Docs Chatbot

Respuesta a preguntas fundamentada sobre un corpus de documentos local, construida sobre las API de Indexing, Search y Chat de Glean y expuesta como una única herramienta MCP.

No hay interfaz web. La interfaz de chat es un cliente MCP: Cursor, Claude Desktop o cualquier otro.

Cómo funciona

data/Halcyon Shared Drive/  ->  Indexing API  ->  Search API  ->  Chat API  ->  {answer, sources, diagnostics}

La búsqueda se ejecuta antes que el Chat, y el Chat nunca recupera: los pasajes se recuperan explícitamente y se pasan. Si nada supera el umbral de relevancia (solapamiento de términos con la pregunta), la respuesta es un honesto «no se encontró contenido indexado» y nunca se llama al Chat.

Related MCP server: faq-rag

Configuración

Requiere Poetry y Python 3.12+.

poetry config virtualenvs.in-project true   # keeps the venv at ./.venv
poetry install
cp .env.example .env      # then fill in the tokens

.env está en gitignore. Nunca confirmes tokens reales.

Variable

Usado por

Notas

GLEAN_INSTANCE

ambos

El SDK construye https://{instance}-be.glean.com

GLEAN_INDEXING_TOKEN

solo indexación

nunca se carga en la ruta de consulta

GLEAN_CLIENT_TOKEN

búsqueda + chat

ámbito Chat/Search, tipo Global

GLEAN_DATASOURCE

ambos

sandbox compartido, por lo que esto establece el espacio de nombres de los ID de documentos

GLEAN_DOCS_ROOT

solo indexación

raíz del corpus (data/Halcyon Shared Drive)

GLEAN_ACT_AS

búsqueda + chat

correo electrónico para actuar como; requerido para tokens Globales

Opcionales, con valores predeterminados: GLEAN_DOC_ID_PREFIX (halcyon), GLEAN_TOP_K (5), GLEAN_MAX_SNIPPET_SIZE (2000), GLEAN_MIN_TERM_OVERLAP (0.30), GLEAN_CHAT_TIMEOUT_MS (60000).

Los dos tokens están separados estructuralmente: Settings.for_indexing() lee GLEAN_INDEXING_TOKEN, Settings.for_query() lee GLEAN_CLIENT_TOKEN y nunca toca la variable de indexación.

Uso

poetry run python -m glean_chat_bot     # the MCP server, on stdio
poetry run glean-index --dry-run        # extract and report, send nothing
poetry run glean-index                  # extract and bulk-push
poetry run glean-index --process-now    # ask Glean to process immediately (1 per 3h)
poetry run pytest                       # contract tests: no network, no tokens
poetry run pytest -m live               # the eval set, against real Glean

Añade -v para el registro de depuración.

La indexación es asíncrona: glean-index devuelve una vez que Glean ha aceptado los documentos, minutos antes de que sean buscables. Confirma la cobertura completa en la consola de administración de Glean antes de confiar en las respuestas.

Configuración del cliente MCP

{
  "mcpServers": {
    "glean-company-docs": {
      "command": "/absolute/path/to/glean-chat-bot/.venv/bin/python",
      "args": ["-m", "glean_chat_bot"],
      "env": {
        "GLEAN_INSTANCE": "support-lab",
        "GLEAN_CLIENT_TOKEN": "...",
        "GLEAN_ACT_AS": "you@example.com",
        "GLEAN_DATASOURCE": "interviewds3"
      }
    }
  }
}

Una herramienta, ask_company_docs(question, top_k=None, include_citations=True) -> dict, que devuelve {answer, sources, diagnostics}. diagnostics informa de qué se buscó y qué se devolvió, para que el modelo que llama pueda distinguir «no coincidió nada» de «mi redacción falló» y reintentar en consecuencia.

Estructura

glean_chat_bot/
  __main__.py      `python -m glean_chat_bot`, the MCP server: one tool over query.ask.ask()
  client.py        indexing and query client factories, the ActAs header
  extraction.py    one adapter per file type, path signals, walk
  indexing.py      the whole write path, behind the `glean-index` command
  models.py        Passage, Source, Answer, ExtractedDoc (pydantic)
  query/           search.py (search -> Passage, the relevance floor)
                   chat.py (chat -> answer + resolved citations)
                   ask.py (ask() — the single orchestration function)
  utils/           config.py (env loading, one Settings, two constructors)
                   logging.py (log format, timing wrapper on every Glean call)
data/              the corpus
docs/              extraction notes
tests/             test_contract.py (the invariants, offline)
                   eval_cases.py + test_eval_live.py (the eval set, `-m live`)

Poetry para dependencias y empaquetado, Ruff para lint y formato. Ejecuta poetry run ruff check . y poetry run ruff format . antes de confirmar.

Aún no implementado

Permisos de grupos y usuarios, filtrado por departamento, anotaciones de frescura, un manifiesto de hash de contenido, reescritura de consultas y reintento adaptativo, streaming, memoria de conversación, reintento y retroceso, Docker, CI.

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables answering natural-language questions from FAQ documents using vector search and LLM generation via an MCP tool.
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables hybrid document search (BM25 and dense) over a configurable corpus via MCP tools, returning passages and sources for AI agents to cite in answers.
    MIT

View all related MCP servers

Related MCP Connectors

  • Query any docs site via MCP. Submit a URL, ask questions, get cited answers.

  • Google AI Overview answers and cited sources via the Apify Google AI Overview API, hosted MCP.

  • Your company's brain for AI agents. Cited, permission-aware knowledge across every system.

View all MCP Connectors

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cmacdonald0514/glean-chat-bot'

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