Chroma logo

Chroma

Community
AlexAI-MCP
chroma

Open-source embedding database for RAG — store embeddings, vector search, metadata filtering. Simple API, scales from notebook to production.

Overview

PublisherAlexAI-MCP
Repositoryhermes-CCC
Skill namechroma
Stars
134
Forks
22
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by AlexAI-MCP on GitHub. Read the source before you install it.

Installation

Install the Chroma AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/AlexAI-MCP/hermes-CCC/tree/master/skills/chroma
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/AlexAI-MCP/hermes-CCC.git /tmp/hermes-CCC
mkdir -p .claude/skills
cp -r /tmp/hermes-CCC/skills/chroma .claude/skills/chroma
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Chroma in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Chroma on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Chroma is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Chroma

Purpose

  • Use this skill to store embeddings and perform semantic retrieval for RAG systems.
  • Prefer Chroma when you want a simple local developer experience with an easy Python API.
  • Chroma works well for notebooks, prototypes, local apps, and moderate production deployments.
  • It supports metadata filtering, server mode, and pluggable embedding functions.

Install

bash
pip install chromadb sentence-transformers
  • Add any extra embedding provider packages you need, such as the OpenAI SDK.

Basic Setup

python
import chromadb

client = chromadb.PersistentClient(path="./chroma_db")
  • PersistentClient stores data on disk.
  • It is a good default for local development and single-node setups.

Create a Collection

python
collection = client.create_collection(name="docs")
  • Use descriptive collection names like docs, papers, tickets, or kb_chunks.
  • A collection is the logical container for your embeddings and payload metadata.

Add Documents

  • Minimal add call:
python
collection.add(
    documents=["Chroma is useful for local RAG.", "Vector search retrieves semantically similar text."],
    metadatas=[{"source": "note1"}, {"source": "note2"}],
    ids=["doc-1", "doc-2"],
)
  • Required arrays must align by index.
  • Keep ids stable if you plan to update or delete records later.

Query

python
results = collection.query(
    query_texts=["How do I store embeddings for RAG?"],
    n_results=5,
)

print(results["documents"])
print(results["metadatas"])
  • query_texts=['...'] is the most common path when Chroma is managing embeddings for you.
  • Start with n_results=5 or 10 for most retrieval experiments.

Basic Collection Lifecycle

  • Create collection
  • Add documents
  • Query for nearest neighbors
  • Update documents when content changes
  • Delete stale records

Get or Create

  • For idempotent startup flows, prefer get_or_create_collection:
python
collection = client.get_or_create_collection(name="docs")
  • This is helpful in services that initialize storage on boot.

Embedding Functions

  • Chroma supports multiple embedding strategies.
  • Common choices include:
  • DefaultEmbeddingFunction
  • SentenceTransformerEmbeddingFunction
  • OpenAIEmbeddingFunction

Default Embedding Function

python
from chromadb.utils.embedding_functions import DefaultEmbeddingFunction

embedding_fn = DefaultEmbeddingFunction()
collection = client.get_or_create_collection(
    name="default-embeddings",
    embedding_function=embedding_fn,
)
  • The default function is convenient for quick experiments.
  • For production, you usually want to control the embedding model explicitly.

SentenceTransformers Embedding Function

python
from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction

embedding_fn = SentenceTransformerEmbeddingFunction(
    model_name="sentence-transformers/all-MiniLM-L6-v2",
)

collection = client.get_or_create_collection(
    name="st-docs",
    embedding_function=embedding_fn,
)
  • This is a good choice for local semantic search with no external API dependency.

OpenAI Embedding Function

python
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction

embedding_fn = OpenAIEmbeddingFunction(
    api_key="YOUR_API_KEY",
    model_name="text-embedding-3-small",
)

collection = client.get_or_create_collection(
    name="openai-docs",
    embedding_function=embedding_fn,
)
  • Use this when you want consistent hosted embeddings across environments.
  • Track model versions because embedding changes can invalidate similarity behavior.

Add Structured Documents

python
collection.add(
    documents=[
        "Retrieval augmented generation combines retrieval with generation.",
        "Chroma collections can store metadata for filtering.",
    ],
    metadatas=[
        {"source": "paper1", "section": "intro", "year": 2024},
        {"source": "paper1", "section": "methods", "year": 2024},
    ],
    ids=["paper1-intro", "paper1-methods"],
)
  • Include source, section, title, author, or timestamp metadata if you need filtered retrieval.

Metadata Filtering

  • Filter by metadata with where:
python
results = collection.query(
    query_texts=["What does the paper say about filtering?"],
    n_results=5,
    where={"source": "paper1"},
)
  • Example requested pattern:

  • where={'source': 'paper1'}

  • Metadata filters are critical for multi-tenant or source-restricted RAG.

Full Text Search

  • Chroma also supports document-side text filtering with where_document.
  • The commonly used operator form is:
python
results = collection.query(
    query_texts=["database"],
    n_results=5,
    where_document={"$contains": "keyword"},
)
  • Some examples on the internet simplify this idea informally as where_document={'...': 'keyword'}.
  • In practice, use the explicit operator form your installed Chroma version documents.

Update Documents

  • Update existing records by ID:
python
collection.update(
    ids=["doc-1"],
    documents=["Chroma stores embeddings persistently for local RAG systems."],
    metadatas=[{"source": "note1", "updated": True}],
)
  • Use stable IDs so updates remain deterministic.

Delete Documents

python
collection.delete(ids=["doc-2"])
  • You can also delete by filter in many workflows:
python
collection.delete(where={"source": "note1"})
  • Deletes are useful for document re-indexing and source cleanup jobs.

Inspect Data

  • Fetch records directly:
python
items = collection.get(ids=["doc-1"])
print(items)
  • Use this for debugging chunk contents, metadata shape, and embedding lifecycle issues.

HTTP Client for Server Mode

  • Chroma can run as a server and be accessed over HTTP.
  • Python client example:
python
import chromadb

client = chromadb.HttpClient(host="localhost", port=8000)
collection = client.get_or_create_collection(name="docs")
  • This is useful when multiple apps need to share one Chroma instance.

Docker Server

  • Start a server with Docker:
bash
docker run -p 8000:8000 chromadb/chroma
  • Pair that with chromadb.HttpClient(host='localhost', port=8000) from Python.
  • For persistent data in Docker, mount a volume rather than relying on container-local storage.

Retrieval Design Tips

  • Chunk documents before indexing.
  • Keep chunk size and overlap consistent during experiments.
  • Store source metadata so retrieved chunks can be traced back to originals.
  • Log your embedding model name and collection schema.

Chroma Strengths

  • Very easy local setup
  • Clean Python API
  • Good fit for notebook and single-service workflows
  • Flexible embedding function support

Chroma Limitations

  • It is simpler than some production-first vector engines.
  • Large-scale distributed deployments may need a more specialized backend.
  • You should benchmark real workloads before using it as a high-scale production default.

Common Failure Modes

  • Empty search results:

  • confirm documents were added

  • confirm the embedding function is configured as expected

  • lower filtering constraints

  • Embedding mismatch:

  • avoid changing embedding models inside the same collection without re-indexing

  • document the embedding function used for each collection

  • Duplicate records:

  • choose deterministic IDs from source path plus chunk index

  • upsert or update intentionally instead of re-adding blind

  • Server connectivity issues:

  • verify the Docker container is running

  • confirm localhost:8000 is reachable

  • switch from PersistentClient to HttpClient only when appropriate

Recommended Workflow

  • Start local with PersistentClient.
  • Use sentence-transformers for quick offline prototypes.
  • Add metadata filters early if you know you need scoped retrieval.
  • Move to server mode when multiple apps or services need shared access.

When To Use This Skill

  • You are building a local RAG system.
  • You need an easy vector store API inside Python.
  • You want metadata-aware retrieval without a heavy infrastructure stack.
  • You need a bridge from notebook experimentation to a small production deployment.

Quick Reference

  • Install: pip install chromadb sentence-transformers
  • Local client: chromadb.PersistentClient(path="./chroma_db")
  • Add docs: collection.add(documents=[...], metadatas=[...], ids=[...])
  • Query: collection.query(query_texts=["..."], n_results=5)
  • Metadata filter: where={"source": "paper1"}
  • Document text filter: where_document={"$contains": "keyword"}
  • Server client: chromadb.HttpClient(host="localhost", port=8000)
  • Docker: docker run -p 8000:8000 chromadb/chroma

Frequently asked questions

What does the Chroma AI skill do?

Open-source embedding database for RAG — store embeddings, vector search, metadata filtering. Simple API, scales from notebook to production.

Why use Chroma on TypingMind?

Because you install it once and use it with any model. Chroma is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Chroma in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/AlexAI-MCP/hermes-CCC/tree/master/skills/chroma. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Chroma?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Chroma?

As many as you like. As long as a model supports skills, you can use Chroma with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Chroma AI skill free?

Yes. It is published on GitHub by AlexAI-MCP under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇