# Glean Core Workflow A

> Execute Glean primary workflow: search, chat, and AI-powered answers across enterprise data. Use when building search integrations, implementing Glean chat, or creating AI assistants. Trigger: "glean search API", "glean chat", "glean AI answers", "enterprise search".

- Skill: `gabrielmoreira/glean-core-workflow-a` (Agent Skill)
- Install (CLI): `npx skillmds@latest add gabrielmoreira/glean-core-workflow-a`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielmoreira/glean-core-workflow-a/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- License: MIT
- Author: gabrielmoreira (https://skillmd.com/u/gabrielmoreira)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/gabrielmoreira/glean-core-workflow-a

---

# Glean Core Workflow A: Search & Chat

## Overview

Build search and chat experiences using the Glean Client API. Covers full-text search with filters, AI-powered chat answers, and autocomplete suggestions.

## Prerequisites

- A scoped search identity, approved datasource filter, and synthetic terms that cannot retrieve company-sensitive material.
- User-consent and retention policy for any analytics, chat history, or feedback capture.
- A rollback path that disables the client or filter without changing source documents or connector ACLs.

## Instructions

### Step 1: Search with Filters and Facets

```typescript
const results = await fetch(`${GLEAN}/client/v1/search`, {
  method: 'POST', headers: searchHeaders,
  body: JSON.stringify({
    query: 'kubernetes deployment best practices',
    pageSize: 20,
    requestOptions: {
      datasourceFilter: 'confluence,github',
      facetFilters: [{ fieldName: 'author', values: ['engineering-team'] }],
    },
  }),
}).then(r => r.json());

results.results?.forEach((r: any) => {
  console.log(`[${r.datasource}] ${r.title}`);
  console.log(`  ${r.snippets?.[0]?.snippet ?? ''}`);
});
```

### Step 2: AI Chat (Glean Assistant)

```typescript
const chatResponse = await fetch(`${GLEAN}/client/v1/chat`, {
  method: 'POST', headers: searchHeaders,
  body: JSON.stringify({
    messages: [{ role: 'USER', content: 'What is our deployment process for production?' }],
    applicationId: 'my-app',
  }),
}).then(r => r.json());

console.log('Answer:', chatResponse.messages?.[0]?.content);
console.log('Sources:', chatResponse.citations?.map((c: any) => c.title).join(', '));
```

### Step 3: Autocomplete / Suggestions

```typescript
const suggestions = await fetch(`${GLEAN}/client/v1/autocomplete`, {
  method: 'POST', headers: searchHeaders,
  body: JSON.stringify({ query: 'deploy', datasourceFilter: 'confluence' }),
}).then(r => r.json());

suggestions.results?.forEach((s: any) => console.log(`  ${s.text}`));
```

## Error Handling

| Error | Cause | Solution |
|-------|-------|----------|
| Empty results | Query too specific or datasource not indexed | Broaden query, check datasource status |
| Chat returns no citations | Content not indexed for chat | Verify documents have body text |
| 403 on search | User permissions | Ensure token has search scope |

## Output

Return a redacted workflow receipt containing datasource scope, correlation ID, result-count band, allow/deny outcomes, and fallback used. Never record query text, titles, snippets, transcripts, or credentials.

## Examples

Run a fictional query against `sandbox-handbook`, verify one authorized identity sees the sample while a denied identity sees none, and record `scope=sandbox-handbook; allow=1; deny=0; fallback=none`.

## Resources

- [Search API](https://developers.glean.com/api/client-api/search/search)
- [Chat API](https://developers.glean.com/api/client-api/search/overview)

## Next Steps

For bulk indexing workflow, see `glean-core-workflow-b`.

