Installs into .claude/skills of the current project.
Are you the author of Glean Hello World?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/jeremylongshore-glean-hello-world-2494093a)
---
name: glean-hello-world
description: 'Index documents into Glean and search them back using the Indexing and
Client APIs.
Use when starting a new Glean custom connector, testing search quality,
or learning the index/search pattern.
Trigger: "glean hello world", "glean example", "glean index document", "glean search".
'
allowed-tools: Read, Write, Edit, Bash(npm:*), Bash(curl:*)
version: 1.8.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>
tags:
- saas
- enterprise-search
- glean
compatibility: Designed for Claude Code
---
# Glean Hello World
## Overview
Index documents into Glean and search them. Two steps: set up a custom datasource with the Indexing API, then query with the Client API.
## Prerequisites
- Use an approved sandbox datasource, scoped non-production credentials, and fictional sample documents only.
- Prepare one synthetic identity allowed to see the sample and one that must be denied, plus a deletion path for the test records.
- Record opaque test IDs locally; do not use a production wiki, employee identity, or real result snippet as tutorial data.
## Instructions
### Step 1: Set Up Custom Datasource
```typescript
const GLEAN = `https://${process.env.GLEAN_DOMAIN}/api`;
const idxHeaders = {
'Authorization': `Bearer ${process.env.GLEAN_INDEXING_TOKEN}`,
'Content-Type': 'application/json',
};
// Create or configure a custom datasource
await fetch(`${GLEAN}/index/v1/adddatasource`, {
method: 'POST', headers: idxHeaders,
body: JSON.stringify({
name: 'my_wiki',
displayName: 'Internal Wiki',
datasourceCategory: 'PUBLISHED_CONTENT',
urlRegex: 'https://wiki.company.com/.*',
iconUrl: 'https://wiki.company.com/favicon.ico',
}),
});
```
### Step 2: Index Documents
```typescript
// Index individual documents
await fetch(`${GLEAN}/index/v1/indexdocuments`, {
method: 'POST', headers: idxHeaders,
body: JSON.stringify({
datasource: 'my_wiki',
documents: [{
id: 'doc-001',
title: 'Getting Started Guide',
url: 'https://wiki.company.com/getting-started',
body: { mimeType: 'text/plain', textContent: 'This guide covers onboarding steps...' },
author: { email: 'jane@company.com' },
updatedAt: new Date().toISOString(),
permissions: { allowAnonymousAccess: true },
}],
}),
});
console.log('Document indexed.');
```
### Step 3: Search
```typescript
const searchHeaders = {
'Authorization': `Bearer ${process.env.GLEAN_CLIENT_TOKEN}`,
'X-Glean-Auth-Type': 'BEARER',
'Content-Type': 'application/json',
};
const results = await fetch(`${GLEAN}/client/v1/search`, {
method: 'POST', headers: searchHeaders,
body: JSON.stringify({
query: 'onboarding getting started',
pageSize: 10,
requestOptions: { datasourceFilter: 'my_wiki' },
}),
}).then(r => r.json());
results.results?.forEach((r: any) => {
console.log(`${r.title} (${r.url}) — score: ${r.score}`);
});
```
## Output
```
Document indexed.
Getting Started Guide (https://wiki.company.com/getting-started) — score: 0.95
```
## Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| `datasource not found` | Datasource not created | Run `adddatasource` first |
| No search results | Indexing not yet complete | Wait 1-2 minutes for processing |
| `invalid document` | Missing required fields | Include `id`, `title`, `url` |
## Examples
Index two fictional records into `sandbox-onboarding`, search for `sample-policy`, then record `indexed=2; allowed_probe=1; denied_probe=0; cleanup=complete`. This demonstrates the boundary without retaining company content.
## Resources
- [Indexing API Overview](https://developers.glean.com/api-info/indexing/getting-started/overview)
- [Search API](https://developers.glean.com/api/client-api/search/search)
- [Index Documents](https://developers.glean.com/api/indexing-api/index-documents)
## Next Steps
Proceed to `glean-local-dev-loop` for development workflow setup.