PipesHub MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PipesHub MCP ServerSearch PipesHub for recent records about the Q3 sales report."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Connecting MCP Clients to PipesHub MCP Server
This guide covers how to connect PipesHub's remote MCP server to Cursor, Claude Code, Gemini CLI, Codex CLI, Claude.ai (Web), and LibreChat using static OAuth credentials or bearer tokens.
PipesHub exposes a remote MCP endpoint over Streamable HTTP at /mcp. MCP Clients connect to this endpoint directly -- no local npm packages or stdio processes needed.
Coding agent? Start at For coding agents. Install the skill into the user's repo with
npx skills add pipeshub-ai/mcp-server(seeskills/pipeshub) and append theAGENTS.mdsnippet on that page. Listed on the official MCP registry asio.github.pipeshub-ai/mcpand on Cursor Directory as PipesHub. The listing files (plugin.json,mcp.json) default MCP tohttp://localhost:3000/mcp(Docker). Change the URL for a company instance; they contain no secrets. Contributors working in this repository: read AGENTS.md.Looking for the tool reference? See TOOLS.md for descriptions, arguments, and a decision guide for each tool the MCP server exposes (
pipeshub_chat,pipeshub_search,pipeshub_get_record_content,pipeshub_download_record,pipeshub_directory,pipeshub_sources,pipeshub_agents).Using QM? QM cannot attach a third-party MCP endpoint — it is an MCP server to its own harness, not a client. Follow Use PipesHub with QM. The deployment-layer bundle in
qm/gives agents apipeshubcommand inside their sandbox; this package ships that command as a second bin.
Prerequisites
A running PipesHub instance (self-hosted or cloud). If they have none yet, the local Docker demo playbook covers install and first-run — do not scaffold LangChain. First-run (account + LLM) is still in the browser; search 500s until an LLM is configured.
An OAuth app created in PipesHub (see Step 1)
Related MCP server: Rocket.Chat MCP Server
Step 1: Create an OAuth App in PipesHub
Log in to your PipesHub instance as an admin
Navigate to Settings > Developer Settings > OAuth Apps
Click Create OAuth App
Fill in the app details:
Name: e.g.,
MCP IntegrationRedirect URIs: Add all the redirect URIs for the clients you plan to use:
Client
Redirect URI
Cursor
cursor://anysphere.cursor-mcp/oauth/callbackClaude Code
http://localhost:<PORT>/callback(e.g.,http://localhost:8080/callback)Claude.ai (Web)
https://claude.ai/api/mcp/auth_callbackGemini CLI
http://localhost:7777/oauth/callbackLibreChat
http://localhost:3080/api/mcp/<server-identifier>/oauth/callback
Important: The scopes in
MCP_SCOPESmust match the scopes granted to your OAuth app — a mismatch will result in an authorization error.
Save the app and copy the Client ID and Client Secret
Customizing Default Scopes
By default, PipesHub exposes some default scopes in its /.well-known/oauth-protected-resource/mcp discovery endpoint. You can customize which scopes are exposed by setting the MCP_SCOPES environment variable on your PipesHub instance. This is useful for clients like Claude Code that automatically request all exposed scopes.
Placeholders
Replace these in all configurations below:
Placeholder | Description | Example |
| Your PipesHub instance URL |
|
| OAuth app client ID |
|
| OAuth app client secret |
|
The remote MCP endpoint URL is: PIPESHUB_INSTANCE_URL/mcp
Remote MCP Setup
Cursor supports static OAuth for remote MCP servers via the auth object in mcp.json.
Configuration
Open Cursor Settings > Tools and Integrations > New MCP Server, or edit your project's .cursor/mcp.json:
{
"mcpServers": {
"pipeshub": {
"url": "PIPESHUB_INSTANCE_URL/mcp",
"auth": {
"CLIENT_ID": "YOUR_CLIENT_ID",
"CLIENT_SECRET": "YOUR_CLIENT_SECRET",
"scopes": [
"org:read", "org:write", "org:admin",
"user:read", "user:write", "user:invite", "user:delete",
"usergroup:read", "usergroup:write",
"team:read", "team:write",
"kb:read", "kb:write", "kb:delete", "kb:upload",
"semantic:read", "semantic:write", "semantic:delete",
"conversation:read", "conversation:write", "conversation:chat",
"agent:read", "agent:write", "agent:execute",
"connector:read", "connector:write", "connector:sync", "connector:delete",
"config:read", "config:write",
"document:read", "document:write", "document:delete",
"crawl:read", "crawl:write", "crawl:delete"
]
}
}
}
}Cursor will auto-discover the authorization and token endpoints via PipesHub's /.well-known/oauth-protected-resource/mcp metadata.
Note: If the
scopesfield is omitted, Cursor fetches/.well-known/oauth-protected-resource/mcpand requests allscopes_supportedlisted there. To limit access, explicitly list only the scopes you need. You can also control which scopes are exposed server-side — see Customizing Default Scopes.
Using Environment Variables
Use Cursor's ${env:VAR} interpolation to keep secrets out of config files:
{
"mcpServers": {
"pipeshub": {
"url": "${env:PIPESHUB_INSTANCE_URL}/mcp",
"auth": {
"CLIENT_ID": "${env:PIPESHUB_CLIENT_ID}",
"CLIENT_SECRET": "${env:PIPESHUB_CLIENT_SECRET}",
"scopes": [
"kb:read", "kb:write",
"semantic:read", "semantic:write",
"conversation:read", "conversation:write", "conversation:chat",
"agent:read", "agent:write", "agent:execute",
"connector:read", "connector:write",
"config:read", "user:read"
]
}
}
}
}Redirect URI
Cursor uses a fixed redirect URI for all MCP servers:
cursor://anysphere.cursor-mcp/oauth/callbackRegister this as the allowed redirect URI when creating the OAuth app in PipesHub.
OAuth Login Troubleshooting
If Cursor's internal browser fails to load the OAuth login page, copy the authorization URL from the internal browser and paste it into your normal browser to complete the login flow.
Claude Code supports remote HTTP MCP servers with static OAuth credentials via --client-id, --client-secret, and --callback-port.
PipesHub exposes discovery at /.well-known/oauth-protected-resource/mcp, so Claude Code auto-discovers the authorization and token endpoints.
Important: Claude Code does not support configuring specific scopes. It fetches
/.well-known/oauth-protected-resource/mcp, reads thescopes_supportedlist, and requests all of them. Your OAuth app in PipesHub must have access to all scopes listed in the discovery endpoint, otherwise the authorization request will fail. To limit the exposed scopes, see Customizing Default Scopes.
Add with CLI
claude mcp add --transport http \
--client-id YOUR_CLIENT_ID \
--client-secret \
--callback-port 8080 \
pipeshub PIPESHUB_INSTANCE_URL/mcp
--client-secretwithout a value prompts for masked input. To skip the prompt, set theMCP_CLIENT_SECRETenvironment variable:MCP_CLIENT_SECRET=YOUR_CLIENT_SECRET claude mcp add --transport http \ --client-id YOUR_CLIENT_ID \ --client-secret \ --callback-port 8080 \ pipeshub PIPESHUB_INSTANCE_URL/mcp
To make it available across all projects:
claude mcp add --transport http --scope user \
--client-id YOUR_CLIENT_ID \
--client-secret \
--callback-port 8080 \
pipeshub PIPESHUB_INSTANCE_URL/mcpAdd with JSON
claude mcp add-json pipeshub '{
"type": "http",
"url": "PIPESHUB_INSTANCE_URL/mcp",
"oauth": {
"clientId": "YOUR_CLIENT_ID",
"callbackPort": 8080
}
}' --client-secretProject-Scoped (.mcp.json)
Create a .mcp.json file in your project root. This can be committed to version control (secrets stay out via env vars):
{
"mcpServers": {
"pipeshub": {
"type": "http",
"url": "${PIPESHUB_INSTANCE_URL}/mcp",
"oauth": {
"clientId": "${PIPESHUB_CLIENT_ID}",
"callbackPort": 8080
}
}
}
}Set environment variables before launching Claude Code:
export PIPESHUB_INSTANCE_URL="https://app.pipeshub.com"
export PIPESHUB_CLIENT_ID="your-client-id"Note: The client secret is stored in the system keychain, not in config files. You'll be prompted to enter it when you first authenticate via
/mcp.
Authenticate
After adding the server, run /mcp inside Claude Code and follow the browser login flow. Tokens are stored securely and refreshed automatically.
Verify
claude mcp list
claude mcp get pipeshubGemini CLI supports remote MCP servers with OAuth via dynamic_discovery (the default), which auto-discovers authorization and token endpoints from PipesHub's /.well-known/oauth-protected-resource/mcp.
Option A: Settings File
Edit ~/.gemini/settings.json:
{
"mcpServers": {
"pipeshub": {
"url": "PIPESHUB_INSTANCE_URL/mcp",
"oauth": {
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_CLIENT_SECRET",
"scopes": [
"org:read", "org:write", "org:admin",
"user:read", "user:write", "user:invite", "user:delete",
"usergroup:read", "usergroup:write",
"team:read", "team:write",
"kb:read", "kb:write", "kb:delete", "kb:upload",
"semantic:read", "semantic:write", "semantic:delete",
"conversation:read", "conversation:write", "conversation:chat",
"agent:read", "agent:write", "agent:execute",
"connector:read", "connector:write", "connector:sync", "connector:delete",
"config:read", "config:write",
"document:read", "document:write", "document:delete",
"crawl:read", "crawl:write", "crawl:delete"
]
}
}
}
}Note: Adjust the
scopeslist to match what your OAuth app was granted. If you only need a subset of tools, you can limit the scopes accordingly.
Option B: CLI Command
gemini mcp add --transport http pipeshub PIPESHUB_INSTANCE_URL/mcpThen edit ~/.gemini/settings.json to add the oauth block as shown above.
Authenticate
Inside Gemini CLI, use the /mcp auth commands:
# List servers and their auth status
/mcp auth
# Authenticate with PipesHub (opens browser for login)
/mcp auth pipeshub
# Re-authenticate if tokens expire
/mcp auth pipeshubOn first connection, Gemini will automatically detect the 401 response, discover the OAuth endpoints, and open a browser for login. Tokens are stored securely in ~/.gemini/mcp-oauth-tokens.json and refreshed automatically.
Manage Servers
# List all configured servers
gemini mcp list
# Remove the server
gemini mcp remove pipeshub
# Temporarily disable/enable
gemini mcp disable pipeshub
gemini mcp enable pipeshubOAuth Configuration Properties
Property | Required | Description |
| Yes | OAuth 2.0 Client ID from PipesHub |
| No | OAuth 2.0 Client Secret (for confidential clients) |
| No | OAuth scopes to request |
| No | Override authorization endpoint (auto-discovered by default) |
| No | Override token endpoint (auto-discovered by default) |
| No | Override redirect URI (defaults to |
Note: OAuth requires a local browser. It will not work in headless environments, remote SSH without X11 forwarding, or containers without browser access.
Codex CLI (OpenAI Codex) connects to remote MCP servers over Streamable HTTP, configured with a [mcp_servers.<name>] table in ~/.codex/config.toml (or .codex/config.toml in your project root to scope it per-project). Codex's HTTP transport authenticates with a bearer token read from an environment variable, so pass a PipesHub JWT bearer token.
[mcp_servers.pipeshub]
url = "PIPESHUB_INSTANCE_URL/mcp"
bearer_token_env_var = "PIPESHUB_BEARER_TOKEN"bearer_token_env_var is the name of the environment variable that holds the token — export it before launching Codex:
export PIPESHUB_BEARER_TOKEN="YOUR_BEARER_TOKEN"The token is the raw JWT, without the
Bearerkeyword.
Or add it with the CLI:
codex mcp add pipeshub \
--url PIPESHUB_INSTANCE_URL/mcp \
--bearer-token-env-var PIPESHUB_BEARER_TOKEN
--bearer-token-env-vartakes the name of the environment variable holding the token, not the token value itself.
Verify
# List configured MCP servers
codex mcp list
# Inside the Codex TUI, view server status and available tools
/mcpClaude.ai supports custom connectors via remote MCP servers. This lets you use PipesHub tools directly in the Claude.ai web interface without any local setup.
Note: This feature is currently in beta. Free plan users are limited to one custom connector.


For Individual Users (Pro / Max Plans)
Go to claude.ai and navigate to Settings > Connectors
Click Add custom connector at the bottom of the Connectors section
Enter the MCP server URL:
PIPESHUB_INSTANCE_URL/mcpClick Advanced settings and enter your OAuth credentials:
OAuth Client ID:
YOUR_CLIENT_IDOAuth Client Secret:
YOUR_CLIENT_SECRET
Click Add
You'll be redirected to PipesHub's login page to authenticate and grant permissions
After authenticating, the connector will be active and PipesHub tools will be available in your Claude.ai conversations
For Team / Enterprise Plans
Organization Owners must first add the connector:
Navigate to Organization settings > Connectors
Click Add custom connector
Enter the MCP server URL:
PIPESHUB_INSTANCE_URL/mcpClick Advanced settings and enter the OAuth Client ID and Client Secret
Click Add
Team members can then connect:
Go to Settings > Connectors
Find the PipesHub connector (marked with a "Custom" label)
Click Connect to authenticate via PipesHub's OAuth login
Redirect URI
Claude.ai uses the following redirect URI for OAuth:
https://claude.ai/api/mcp/auth_callbackRegister this as an allowed redirect URI in your PipesHub OAuth app.
Security Notes
Only connect to trusted MCP servers
Review the permissions requested during the OAuth authentication flow
Claude.ai interacts with PipesHub on your behalf using the granted OAuth token — your password is never shared
LibreChat supports remote MCP servers with OAuth authentication via its custom connectors UI. This lets you connect PipesHub tools to any model available in your LibreChat instance.

Configuration
Log in to your LibreChat instance
Navigate to MCP Servers settings panel
Click Add to create a new custom MCP connector
Fill in the connector details:
Name:
Pipeshub(or any name you prefer)MCP Server URL:
PIPESHUB_INSTANCE_URL/mcpTransport: Select Streamable HTTPS
Authentication: Select OAuth
Enter your OAuth credentials:
Client ID:
YOUR_CLIENT_IDClient Secret:
YOUR_CLIENT_SECRETAuthorization URL:
PIPESHUB_INSTANCE_URL/api/v1/oauth2/authorizeToken URL:
PIPESHUB_INSTANCE_URL/api/v1/oauth2/tokenScope:
openid email(or additional scopes as needed)
Check I trust this application
Click Add to save the connector
After adding, LibreChat will generate a Redirect URI displayed in the connector settings panel (next to the copy button). It follows this format:
http://localhost:3080/api/mcp/<server-identifier>/oauth/callbackCopy the Redirect URI and register it as an allowed redirect URI in your PipesHub OAuth app (see Step 1)
Return to the LibreChat connector and click Update to initiate the OAuth flow — you'll be redirected to PipesHub's login page to authenticate and grant permissions
Redirect URI
LibreChat generates the redirect URI after the connector is created. The URI follows this format:
http://localhost:3080/api/mcp/<server-identifier>/oauth/callbackWhere <server-identifier> is the unique identifier assigned by LibreChat (visible at the top of the connector settings as "Unique Server Identifier"). You must copy this URI and add it to your PipesHub OAuth app's allowed redirect URIs before authenticating.
Note: If your LibreChat instance runs on a different host or port, the URI will reflect that (e.g.,
https://chat.example.com/api/mcp/pipeshub/oauth/callback).
Scopes
LibreChat allows you to specify the OAuth scopes in the Scope field. Use a space-separated list:
openid emailTo request PipesHub-specific scopes, add them to the scope field:
openid email org:read kb:read kb:write semantic:read conversation:read conversation:write conversation:chat agent:read agent:executeNote: The scopes you request must match the scopes granted to your OAuth app in PipesHub. See Customizing Default Scopes for details.
Local MCP Server (Stdio)
Instead of connecting to PipesHub's remote MCP endpoint, you can run the MCP server locally as a stdio process using the @pipeshub-ai/mcp npm package. This is useful when you prefer a local setup or need to work in environments where direct HTTP connections to the remote MCP endpoint aren't practical.
Prerequisites
Node.js 18+ installed
A PipesHub instance URL
Authentication credentials: either a Bearer token (JWT) or OAuth Client ID + Secret
Placeholders
Replace these in all configurations below:
Placeholder | Description | Example |
| Your PipesHub instance URL |
|
| JWT Bearer token for authentication |
|
| OAuth app client ID |
|
| OAuth app client secret |
|
Configure in Claude Desktop settings (claude_desktop_config.json):
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--bearer-auth",
"YOUR_BEARER_TOKEN"
]
}
}
}With OAuth credentials:
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--client-id",
"YOUR_CLIENT_ID",
"--client-secret",
"YOUR_CLIENT_SECRET",
"--token-url",
"/api/v1/oauth2/token"
]
}
}
}Open Cursor Settings > Tools and Integrations > New MCP Server, or edit your project's .cursor/mcp.json:
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--bearer-auth",
"YOUR_BEARER_TOKEN"
]
}
}
}With OAuth credentials:
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--client-id",
"YOUR_CLIENT_ID",
"--client-secret",
"YOUR_CLIENT_SECRET",
"--token-url",
"/api/v1/oauth2/token"
]
}
}
}claude mcp add pipeshub -- npx -y @pipeshub-ai/mcp start \
--server-url PIPESHUB_INSTANCE_URL \
--bearer-auth YOUR_BEARER_TOKENWith OAuth credentials:
claude mcp add pipeshub -- npx -y @pipeshub-ai/mcp start \
--server-url PIPESHUB_INSTANCE_URL \
--client-id YOUR_CLIENT_ID \
--client-secret YOUR_CLIENT_SECRET \
--token-url /api/v1/oauth2/tokengemini mcp add pipeshub -- npx -y @pipeshub-ai/mcp start \
--server-url PIPESHUB_INSTANCE_URL \
--bearer-auth YOUR_BEARER_TOKENWith OAuth credentials:
gemini mcp add pipeshub -- npx -y @pipeshub-ai/mcp start \
--server-url PIPESHUB_INSTANCE_URL \
--client-id YOUR_CLIENT_ID \
--client-secret YOUR_CLIENT_SECRET \
--token-url /api/v1/oauth2/tokenRun the MCP server as a local stdio process, authenticated with an OAuth app's Client ID and Secret (the client_credentials grant). Edit ~/.codex/config.toml (or .codex/config.toml in your project root):
[mcp_servers.pipeshub]
command = "npx"
args = [
"-y",
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL/api/v1",
"--client-id",
"YOUR_CLIENT_ID",
"--client-secret",
"YOUR_CLIENT_SECRET",
"--token-url",
"/api/v1/oauth2/token",
]Notes:
--server-urlmust include/api/v1.--token-url /api/v1/oauth2/tokenis required.
Or authenticate with a JWT bearer token instead:
[mcp_servers.pipeshub]
command = "npx"
args = [
"-y",
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL/api/v1",
"--bearer-auth",
"YOUR_BEARER_TOKEN",
]Open Command Palette > MCP: Open User Configuration, then add:
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--bearer-auth",
"YOUR_BEARER_TOKEN"
]
}
}
}Open Windsurf Settings > Cascade > Manage MCPs > View raw config, then add:
{
"mcpServers": {
"pipeshub": {
"command": "npx",
"args": [
"@pipeshub-ai/mcp",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--bearer-auth",
"YOUR_BEARER_TOKEN"
]
}
}
}To run the local MCP server from a cloned repository instead of the npm package:
git clone https://github.com/pipeshub-ai/pipeshub-ai.git
cd pipeshub-ai
npm install
npm run build
node ./bin/mcp-server.js start --server-url PIPESHUB_INSTANCE_URL --bearer-auth YOUR_BEARER_TOKENFor MCP client configuration, replace npx @pipeshub-ai/mcp with node ./bin/mcp-server.js:
{
"mcpServers": {
"pipeshub": {
"command": "node",
"args": [
"./bin/mcp-server.js",
"start",
"--server-url",
"PIPESHUB_INSTANCE_URL",
"--bearer-auth",
"YOUR_BEARER_TOKEN"
]
}
}
}To debug with MCP Inspector:
npx @modelcontextprotocol/inspector node ./bin/mcp-server.js start --server-url PIPESHUB_INSTANCE_URL --bearer-auth YOUR_BEARER_TOKENCLI Help
For a full list of server arguments:
npx @pipeshub-ai/mcp --helpHow It Works
Architecture
AI Client (Cursor / Claude Code / Gemini CLI / Codex CLI / Claude.ai / LibreChat)
│
│ HTTP POST (JSON-RPC)
│ Authorization: Bearer <token>
▼
PIPESHUB_INSTANCE_URL/mcp
│
│ StreamableHTTP Transport
│ (stateless, per-request MCP server)
▼
PipesHub API (curated tool set — see TOOLS.md)OAuth Protected Resource Discovery
PipesHub exposes OAuth protected resource discovery at:
PIPESHUB_INSTANCE_URL/.well-known/oauth-protected-resource/mcpThis returns all OAuth endpoints automatically:
Authorization:
PIPESHUB_INSTANCE_URL/api/v1/oauth2/authorizeToken:
PIPESHUB_INSTANCE_URL/api/v1/oauth2/tokenRevocation:
PIPESHUB_INSTANCE_URL/api/v1/oauth2/revokeJWKS:
PIPESHUB_INSTANCE_URL/.well-known/jwks.json
Troubleshooting
"Incompatible auth server: does not support dynamic client registration"
This means the client is trying dynamic registration instead of using your pre-configured credentials. Make sure you passed --client-id and --client-secret (Claude Code) or the auth object (Cursor) correctly.
Authentication fails / redirect error
Ensure the Redirect URI in your OAuth app matches exactly what the client uses:
Cursor:
cursor://anysphere.cursor-mcp/oauth/callbackClaude Code:
http://localhost:<callbackPort>/callbackClaude.ai:
https://claude.ai/api/mcp/auth_callbackGemini CLI:
http://localhost:7777/oauth/callbackLibreChat:
http://localhost:3080/api/mcp/<server-identifier>/oauth/callback
Make sure the OAuth app is active (not suspended) in PipesHub
Cannot reach MCP endpoint
Verify the endpoint is accessible:
curl -X POST PIPESHUB_INSTANCE_URL/mcp(should return 401, not connection error)Check that your PipesHub instance has MCP enabled
Debugging with MCP Inspector
npx @modelcontextprotocol/inspectorThen connect to PIPESHUB_INSTANCE_URL/mcp with a Bearer token to test the endpoint directly.
FAQ
Update the
MCP_SCOPESenvironment variable on your PipesHub instance to include the new scopes you want exposed via the discovery endpoint.Update the OAuth app scopes in PipesHub: go to Settings > Developer Settings > OAuth Apps, select your OAuth app, and add or remove scopes as needed.
Re-authenticate the client — existing tokens carry the old scopes, so you need to re-authenticate to get a new token with the updated scopes. For example:
Cursor: Remove and re-add the MCP server, or clear the cached OAuth token and reconnect.
Claude Code: Run
/mcpand complete the browser login flow again.Gemini CLI: Run
/mcp auth pipeshubto re-authenticate.Codex CLI: Update
PIPESHUB_BEARER_TOKENwith a fresh token and restart Codex.Claude.ai: Disconnect and reconnect the connector in Settings > Connectors.
Available Tools
7 toolspipeshub_agentsARead-onlyIdempotent
List the PipesHub agents configured for this org, each with its capabilities.
Agents are specialized assistants (custom system prompt, tools, knowledge
scope). To converse with one, take its agentId and pass it to
pipeshub_chat's agentId argument.
Each agent is returned as:
{ agentId, name, description, systemPrompt, startMessage, tags, webSearch, isActive, toolsets, knowledge }.
toolsets— what the agent can DO: each{ name, tools }wherenameis the connector (e.g.jira,gmail) andtoolsare the runnable tool ids (e.g.jira.create_issue,gmail.send_email).knowledge— what the agent can READ: each{ name, type }(e.g.Confluence-2/Confluence).
Route on toolsets/knowledge, not the name — names and descriptions
are often generic or misleading. Match the request to the agent whose tools can
actually perform it (e.g. "create a Jira ticket" → the agent whose toolset is
jira and whose tools include jira.create_issue). If NO agent has a tool
for the requested action, say so — don't force an unrelated agent.
The list may be empty (no agents configured). For plain Q&A when no
specific agent is needed, use pipeshub_chat WITHOUT agentId and pick a
chatMode: internal_search (org's indexed knowledge) or web_search
(live web). Use agentId everywhere an agent is referenced.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Optional case-insensitive substring match across agent name, description, and tags. Omit to return every agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that the list may be empty, reveals the exact return object shape, explains the semantics of toolsets and knowledge, and warns that names/descriptions can be misleading. This is rich behavioral context that helps the agent interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical, but every section earns its place: purpose, return structure, field semantics, routing guidance, and empty-list caveat. The use of bullets and bolded field names keeps it scannable and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully compensates by detailing the return object, nested structures, and field meanings. It also covers edge cases (empty list, misleading names) and alternatives, making it complete for an agent to invoke and interpret correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single search parameter with 100% coverage, including case-insensitivity, substring matching, and omit behavior. The description adds no further parameter-level detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the PipesHub agents configured for this org, each with its capabilities.' It also clearly differentiates this tool from siblings like pipeshub_chat by explaining that this is for listing agents, not conversing with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing instructions: use this tool to discover agents, take the agentId, and pass it to pipeshub_chat; for plain Q&A use pipeshub_chat without agentId. It also states when to refrain from forcing an unrelated agent, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_chatA
Ask a question, get an answer grounded in the org's indexed data with citations. It reads a few retrieved passages — never a whole document, never a complete list.
Three questions this tool gets WRONG. Check them first:
Structure — "what's under this epic?", "which pages are in this space?", "what links to this ticket?", "what's in this folder?" →
pipeshub_get_record_contentmode:"navigate". Ranking cannot see how records relate.Exhaustive — "how many X?", "list ALL the Y", "every Z" →
mode:"navigate", which reports the group's real total. This tool undercounts and will not say so.One named document — summarize it, extract from it, what does it say about X →
pipeshub_searchfor therecordId, thenmode:"content".
Everything else about the org's knowledge belongs here: policies, processes, decisions, history, "what do we know about X", and any question spanning several documents.
Internal search (default, chatMode: "internal_search"): the user's
documents, files, knowledge base, company policies — anything in their
PipesHub-indexed sources (Drive, Box, Confluence, Slack, Gmail, Jira, the
org's KB, ...).
Web search (chatMode: "web_search"): current events or public
information unlikely to be in the org's knowledge base.
Both are plain-chat modes. Agent chat — pass an agentId from
pipeshub_agents — runs against that agent's own prompt, tools and knowledge;
quick is its only mode, requires the agentId, and is sent automatically.
"What's our policy on Y?" →
pipeshub_chat(internal_search)"What's in the news about Z?" →
pipeshub_chat(web_search)"Find / locate the file named X" →
pipeshub_search(thenpipeshub_download_recordif the user wants the bytes).
Conversation lifecycle — one tool, both start and continue:
First turn: omit
conversationId. The server creates a new conversation; captureconversationIdfrom the response.Follow-up turn: pass the
conversationIdfrom the previous response. Server-side context is preserved — do NOT replay earlier messages, andfiltersis ignored on follow-ups (set once at creation).
Only re-omit conversationId (start a fresh conversation) when the
user explicitly asks to start over / clear context.
The response contains the AI's answer plus citations. To download a
cited document, take citations[*].recordId and call
pipeshub_download_record.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The user's question or message for this turn. | |
| agentId | No | Optional PipesHub agent to converse with — the `agentId` from `pipeshub_agents`. When set, this turn runs against that agent's configuration (prompt, tools, knowledge). On follow-up turns pass the SAME `agentId` together with the `conversationId` returned by the previous call. Omit for a plain (non-agent) conversation. If unsure which agent to use, call `pipeshub_agents` first to see the options. | |
| filters | No | Source scoping for retrieval. Pass `apps` ids from `pipeshub_sources`. Only meaningful on the FIRST turn (when starting a new conversation). | |
| chatMode | No | Response strategy. The valid values depend on whether `agentId` is set: - WITHOUT `agentId` (plain chat): `internal_search` — answer from the org's indexed knowledge (default) — or `web_search` — answer from the live web. - WITH `agentId` (agent chat): `quick` is the only supported mode and is sent automatically, so this argument can be omitted. | |
| modelKey | No | Model id to use (from `pipeshub_sources` `llmModels[*].modelKey`). Defaults to the org's default LLM. | |
| modelName | No | ||
| conversationId | No | Existing conversation id to continue. Omit on the FIRST turn; on every subsequent turn pass the `conversationId` returned by the previous call. Server-side message history is preserved — do NOT replay prior messages. | |
| modelFriendlyName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the annotations: it reads only a few retrieved passages, never a whole document or complete list; it undercounts exhaustive queries and won't say so; conversation lifecycle behavior (omit conversationId on first turn, pass it on follow-ups, filters ignored on follow-ups); and how to download cited documents. The annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, and the description adds substantial context about what the tool does and doesn't do. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: the three-wrong-questions list, the mode explanations, the conversation lifecycle, and the citation download pointer. It's well-structured with bold headers and bullet-like formatting. It could be slightly more concise, but the density of actionable information justifies the length. The most critical routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 8 parameters, nested objects, no output schema, and multiple modes, the description is remarkably complete. It covers the three modes (internal_search, web_search, agent chat), the conversation lifecycle, the filters scoping, the citation download flow, and the routing to siblings. The only minor gap is that it doesn't describe the exact response format beyond 'answer plus citations', but the description explicitly tells the agent how to use citations, which is what matters for follow-up actions. No output schema exists, so the description carries the burden, and it does so thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents most parameters. The description adds meaning beyond the schema by explaining the conversation lifecycle (omit conversationId on first turn, pass it on follow-ups, filters ignored on follow-ups), the chatMode semantics (internal_search vs web_search vs quick with agentId), and the filters behavior (only meaningful on first turn, apps ids from pipeshub_sources). This is valuable semantic context that the schema alone doesn't provide. The description doesn't cover modelKey/modelName/modelFriendlyName, but those are self-explanatory and the schema covers them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Ask a question, get an answer grounded in the org's indexed data with citations.' It immediately distinguishes itself from siblings by naming the three question types it gets wrong and routing them to pipeshub_get_record_content and pipeshub_search. This is a clear, specific purpose statement that differentiates the tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance. It lists three categories of questions the tool gets wrong and directs the agent to the correct alternative for each. It also gives concrete examples ('What's our policy on Y?' → pipeshub_chat internal_search; 'Find / locate the file named X' → pipeshub_search). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_directoryARead-onlyIdempotent
Look up people, groups, and teams in PipesHub. One tool with five
actions — pick the right action:
whoami— who is the caller? Use this whenever you need the authenticated user's own id, email, or full name (e.g. beforeget_useron themselves). Errors if the credential is expired or revoked.list_users— search / page through org users.get_user— fullUserdocument for one user (requiresuserId).list_groups— list user groups withuserCount.list_my_teams— teams the caller belongs to, with capability flags (canEdit/canDelete/canManageMembers).
Output shape varies by action; see each action's docs above.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination — 1-based page number. Used by list_* actions. | |
| limit | No | Pagination — items per page. Used by list_* actions. | |
| action | Yes | What to do: - `whoami` — return the authenticated user's identity, confirmed against the server. No other args needed. - `list_users` — paginated list of org users. Optional `page`, `limit`, `search` (substring match against name or email). - `get_user` — full profile for one user. Required `userId`. Use `whoami` to find your own id first if needed. - `list_groups` — paginated list of user groups (with `userCount`). - `list_my_teams` — teams the authenticated user belongs to, with capability flags. | |
| search | No | Substring match against name / email. Used by list_users. | |
| userId | No | Required when `action` is `get_user`. 24-character ObjectId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context beyond that: whoami errors if the credential is expired/revoked, and output shape varies by action. It also notes that whoami is 'confirmed against the server', implying a network round-trip. These are useful, non-obvious details that help an agent understand side effects and failure modes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: a one-line purpose, then a bullet list of actions with their unique characteristics. It front-loads the main intent and uses formatting to make scanning easy. Every sentence earns its place – no filler or redundancy. The length is appropriate for a multi-action tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is read-only with five actions and a fully self-describing schema, the description covers the essential information: each action's purpose, when to use it, required vs optional parameters, and the nature of the output (e.g., userCount, capability flags). It could mention default pagination values or what happens on empty results, but those are minor gaps. No output schema exists, so the description must convey output variability – it does. Overall, an agent can correctly invoke this tool based on the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – every parameter (action, page, limit, search, userId) has a description in the schema. The description essentially mirrors the schema content, re-stating what each action does and its parameters. Since the schema already carries the full burden, the description adds little new meaning. Baseline 3 is appropriate; it doesn't hurt but doesn't enhance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Look up people, groups, and teams in PipesHub' – a specific verb, resource, and domain. It enumerates five distinct actions (whoami, list_users, get_user, list_groups, list_my_teams) and describes what each returns, making it immediately distinguishable from sibling tools like pipeshub_search or pipeshub_get_record_content. No ambiguity remains about what the tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit per-action usage guidance: it tells you to use whoami when you need the caller's identity, and even notes to use it before get_user on yourself. It lists prerequisites for get_user (userId) and states that list_* actions use pagination. However, it doesn't explicitly contrast this tool with siblings (e.g., 'for full-text search use pipeshub_search'), so it's not perfect, but it's clear enough for an agent to choose the correct action within the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_download_recordARead-onlyIdempotent
Stream the binary content of a single record from PipesHub.
Typical sources for the recordId:
A chat citation:
pipeshub_chatresponse →citations[*].recordId.A search result:
pipeshub_searchresponse →hits[*].recordId/uniqueRecords[*].recordId.
Response Content-Type is forwarded from the upstream service —
application/pdf, application/octet-stream, etc. Binary content is
returned base64-encoded; text content is returned inline.
| Name | Required | Description | Default |
|---|---|---|---|
| recordId | Yes | Record identifier — usually a UUID for connector-sourced records or a 24-character ObjectId for uploaded records. Get it from a chat citation (`citations[*].recordId`) or from a `pipeshub_search` hit. | |
| convertTo | No | Optional server-side format conversion target (e.g. `pdf`). When omitted, the original file bytes are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent read (`readOnlyHint: true`, `idempotentHint: true`, `destructiveHint: false`), lowering the burden on the description. The description adds useful behavioral detail beyond annotations: it explains that the Content-Type is forwarded from upstream, binary content is base64-encoded, and text content is inline. This gives the agent realistic expectations about the response without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action. The bullet-style source examples are easy to scan Bernstein and the final sentence clearly conveys response encoding without redundancy. No sentence is wasted, and the structure helps an agent quickly extract the key facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two parameters, one required, and no output schema, the description covers the essential call details: where to get `recordId`, what the response is like, and how content is encoded. The main miss is the lack of guidance about how this tool relates to `pipeshub_get_record_content`, which prevents the context from being fully complete for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents both parameters well. The description adds examples of where `recordId` comes from, but these examples also appear in the schema's parameter description. It does not meaningfully extend parameter understanding, particularly for `convertTo`, which is only described in the schema. This matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Stream the binary content of a single record from PipesHub.' The title 'Download a document by record id' reinforces the operation. However, it does not explicitly contrast with the sibling `pipeshub_get_record_content`, so an agent may not be able to distinguish the two tools solely from this description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context for the `recordId` parameter by pointing to chat citations and search results, which helps an agent know where to obtain the input. It does not, however, say when to prefer this tool over alternatives such as `pipeshub_get_record_content`, nor does it state exclusions or conditions for use. The usage guidance is therefore implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_get_record_contentARead-onlyIdempotent
Three operations on the org's records. Pick by what you hold:
mode:"lookup" — a URL, issue key (PA-1787), or external ID
→ its recordId plus the record's metadata
mode:"navigate" — a question about structure: what is under X,
what links to Y → browses the hierarchy
mode:"content" — a recordId, and you need the document's COMPLETE text
mode:"content" (default) — the only way to see a document's complete
text. Use it whenever missing part of the document could make the answer
wrong: summarize, extract or list ALL of something, check whether or where
a doc mentions X, review, or compare named docs. pipeshub_chat cannot do
these — it never sees a whole document.
Judge by the user's INTENT, not their keywords: "what's this doc about?",
"walk me through the report", "anything in here about Y?" are all
full-content tasks. Get the recordId from a pipeshub_search top hit, a
chat citation, or mode:"lookup".
Returns one content string: a metadata header (title, source, key fields,
pre-generated summary) then the full parsed text. A record with no
extractable content returns the literal No record found. Use
pipeshub_download_record only for the original file bytes.
mode:"navigate" — browse the hierarchy: RecordGroup (project /
space / drive / folder) → Record (epic / story / page / file) → children,
with breadcrumbs, related links and record IDs.
Use it when the question depends on structure rather than wording: what is under this epic, which pages sit in this space, what is linked to this ticket, what is in this folder — and every "how many" / "all of" / "every" question. Search ranks by content; only this shows how records relate, and only this gives a count you can trust.
Omit nodeId for a flat listing of everything reachable, most recently
updated first — the usual starting point. A URL, an issue key, or a
pipeshub_sources id also works and resolves automatically.
Pass depth:2 or depth:3 to see several levels in ONE call — an epic's
stories AND their subtasks, a space's pages AND their children — instead of
one call per level. Use it whenever the question needs an overview of a
hierarchy rather than a single node.
Opening a record also prints that record's own metadata — for a ticket,
status, assignee, priority and dates — so a question about one record is
often answered by this call alone. It returns no document text; for that,
re-call with mode:"content".
Returns Path breadcrumbs, the current node's metadata, a children listing
carrying record_id= or node_id= per row plus the group's total
(Children 1-50 of 61), Related cross-references, and a Next: line.
One page is usually every child, so only pass page:2 when that Next:
line says more exist.
mode:"lookup" — turn an external reference into a recordId, the first
step whenever the question names one. Returns that record's metadata (for a
ticket: status, assignee, priority, dates) plus its recordId, which
mode:"navigate" takes to list what is under it and mode:"content" takes
to read it.
Handles Jira keys and URLs, Confluence, Drive, Slack permalinks, Linear, Notion, ServiceNow sys_id, SharePoint, Gmail/Outlook, and any connector whose records index a web URL. Resolution searches ALL connectors you can access, regardless of any source filter you used elsewhere.
A miss is a 200 with empty matches and the input echoed in
not_found_identifiers — that may mean no-access, not non-existence. Use
mode:"navigate" to confirm the record exists before telling the user it
does not. If ambiguous is true, pick from matches rather than taking
the first.
Navigate and lookup return a rendered text view whose closing Next: line
names the exact follow-up call — follow it. When presenting a record, link
it using the Web URL from its metadata header (when present).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | `content` (default) reads a record's full text by `recordId`. `lookup` resolves a URL / issue key / external ID to a recordId. `navigate` browses the knowledge graph tree. | content |
| page | No | Page number, 1-indexed. | |
| depth | No | Levels of descendants to return in one call. Above 1, the listing is a flat list of all descendants down to that level rather than only direct children, and each row carries its own `level`. | |
| limit | No | Children per page. The minimum is 50 — smaller values are rejected rather than silently raised. | |
| nodeId | No | The node to open. Take it from a `record_id=` or `node_id=` shown in a previous navigate or lookup response, from a search hit's `recordId`, or from a `pipeshub_sources` id — a KB or connector id opens that source directly. Omit it entirely for the flat listing of everything reachable, newest first — the usual starting point. A URL or an issue key such as `PA-1787` also works: it is resolved to its record automatically, so no separate lookup is needed. | |
| recordId | No | Record identifier — usually a UUID for connector-sourced records or a 24-character ObjectId for uploaded records. Get it from a chat citation (`citations[*].recordId`) or from a `pipeshub_search` hit. Required when `mode` is `content`. | |
| nodeTypes | No | Restrict children to these node types, e.g. `["record", "folder"]`. | |
| identifiers | No | The reference(s) to resolve: a URL, an issue key such as `PA-1787`, or a bare external system ID. Paste each exactly as you found it — tracking parameters and fragments are handled. Pass a single string, or an array of up to 10 to resolve them in one call. Required when `mode` is `lookup`. | |
| createdAfter | No | Filter children by source creation time. ISO 8601 `YYYY-MM-DD`, or a full datetime that MUST carry a timezone offset — a naive datetime is rejected rather than assumed to be UTC. | |
| connectorName | No | Optional hint that prioritises resolution order, e.g. `JIRA`, `CONFLUENCE`, `GOOGLE_DRIVE`, `SLACK`. It cannot widen the search beyond the connectors you can already access. Useful on a retry when a lookup came back empty. | |
| createdBefore | No | Filter children by source creation time. `YYYY-MM-DD` is inclusive of the whole day. | |
| modifiedAfter | No | Filter children by source modification time. Same formats as `createdAfter`. | |
| modifiedBefore | No | Filter children by source modification time. Same formats as `createdBefore`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=true), the description discloses return formats, edge cases ('No record found', '200 with empty matches', 'ambiguous' handling), resolution behavior ('searches ALL connectors'), pagination triggers ('only pass page:2 when Next: line says more'), and rendering details. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but every sentence adds practical value for a tool with three modes and 13 parameters. It is front-loaded with a mode summary, uses clear section headers, and avoids filler. The structure mirrors the decision flow an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema, the description fully explains return values for all modes, prerequisites (like obtaining recordId), error/edge behaviors, and sibling routing. Nothing an agent needs to invoke correctly is missing, given the rich schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant contextual meaning: explains how to obtain nodeId, when to omit it, how depth affects output, how identifiers resolve automatically, and how to interpret returns like 'Children 1-50 of 61'. These are usage patterns beyond schema field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs three operations (lookup, navigate, content) on the org's records, with each mode named and explained. It explicitly differentiates from siblings (pipeshub_chat cannot see whole docs, pipeshub_download_record for raw bytes), making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance per mode, including intent-based examples ('what's this doc about?' → content) and exclusions ('Use pipeshub_download_record only for the original file bytes', 'pipeshub_chat cannot do these'). Also tells when to pass depth and how to get recordId, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_searchAIdempotent
Vector / semantic search across the org's indexed documents.
Use this when the user wants to LOCATE a document — by name, topic,
or a phrase to grep for — and to resolve it to a recordId. For
open-ended questions across many documents, use pipeshub_chat
instead, which does the retrieval internally and grounds the answer in
citations.
Typical uses:
Resolve a doc name / topic into a
recordIdforpipeshub_get_record_content— step 1 of any full-document task (summarize, extract, review, "what does the doc say?").Resolve a filename / phrase into a
recordIdforpipeshub_download_record.Show the user a ranked list of matching files when they ask "find / search for X".
Not for structural questions — what is under this epic, which pages are
in this space, what links to this ticket. Ranking by content cannot show
how records relate; use pipeshub_get_record_content mode:"navigate".
A ranked sample, never a complete list. Hits are the top-scoring blocks from the best-matching records — not all blocks of any record, and not every record that matches. Never count them to answer "how many" / "all" / "every"; navigate the record group instead, which reports its real total.
The response is trimmed to one row per hit:
{ recordId, recordName, score, snippet, mimeType, webUrl, ... }.
Highest score first; multiple hits may share the same recordId
(different blocks of the same record).
When presenting results to the user, link each record using its
webUrl (when present).
| Name | Required | Description | Default |
|---|---|---|---|
| apps | No | Source-scoping ids — connector instance UUIDs and / or `knowledgeBase_<orgId>`. Get them from `pipeshub_sources`. | |
| limit | No | Max number of result chunks. Default 10. Use a small value (5–10) when the goal is to resolve a filename / topic into a recordId. | |
| query | Yes | Natural language query. Vector search across the org's indexed records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations providing idempotentHint and destructiveHint, the description goes much further: it discloses that results are 'a ranked sample, never a complete list', that hits are top-scoring blocks rather than all matches, and that counts should not be used for 'how many'/'all'/'every' answers. This is rich behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with bolded headers and bullets, and every section carries operational value. It is front-loaded with the core purpose before caveats. Some minor redundancy with the schema's query description exists, but the density is justified by the important sampling caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by giving the response row shape, ordering, and the possibility of duplicate recordIds across hits. It also covers result presentation via webUrl and warns against misusing the ranked sample for counts. For a search tool with three parameters, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a meaningful schema description, so the baseline is 3. The description adds extra value by recommending small limit values (5–10) for filename/topic resolution and noting that apps come from pipeshub_sources, which helps agents choose parameters more effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Vector / semantic search across the org's indexed documents', and clarifies the tool's primary purpose: LOCATE a document and resolve it to a recordId. It explicitly differentiates from pipeshub_chat and pipeshub_get_record_content, so an agent can distinguish it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use this when the user wants to LOCATE a document') and when-not-to-use guidance ('Not for structural questions'), naming pipeshub_chat and pipeshub_get_record_content mode:navigate as alternatives. It also lists typical use cases, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeshub_sourcesARead-onlyIdempotent
Discover available chat sources and AI models in one call.
Returns up to three sections:
sources— every connector instance the org has wired up plus the syntheticknowledgeBase_<orgId>entry for the org's KB. Each item'sidis exactly the value to put inpipeshub_chat's orpipeshub_search'sappsfilter.llmModels— chat / generation models. Each item'smodelKeyis the value to pass onpipeshub_chat/pipeshub_searchasmodelKey. PickisDefault: trueunless the user asks for a specific model.embeddingModels— vector embedding models (only fetched when explicitly requested viainclude).
Call this once at the start of a session and cache the result —
sources and models change infrequently. sources and llmModels
are returned by default; pass include to override.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Which sections to fetch. Default: `["sources", "llmModels"]`. Add `embeddingModels` if the user is configuring re-embedding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and idempotent, and the description goes further: it discloses the synthetic knowledgeBase_<orgId> entry, the default sections, the conditional fetching of embeddingModels, and the stable-but-changeable nature of the data. It also says exactly which returned field to pass to which sibling parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the one-line purpose, uses bulleted sections and code formatting, and every sentence earns its place. The only slight length is justified by the lack of an output schema, so it needs to describe return structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only discovery tool with no output schema, it fully explains the three return sections, the special knowledgeBase source, the exact field-to-parameter mappings, the default selections, and when to request embedding models. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the schema already documents include's enum, default value, and the re-embedding use case. The description reinforces that and adds an isDefault selection hint, but it adds no material parameter meaning beyond the schema, so the high-coverage baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Discover available chat sources and AI models in one call.' It clearly enumerates the three returned sections and distinguishes this discovery tool from chat/search siblings by explaining that its ids feed pipeshub_chat and pipeshub_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage timing: 'Call this once at the start of a session and cache the result.' It also explains when include should be varied and how returned values are consumed by sibling tools. It does not explicitly name sibling alternatives to exclude, but the discovery-vs-action separation is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v2.3.3- First observed
pipeshub_agents - First observed
pipeshub_chat - First observed
pipeshub_directory - First observed
pipeshub_download_record - First observed
pipeshub_get_record_content - First observed
pipeshub_search - First observed
pipeshub_sources
TDQS
Scored across 7 tools
Each tool has a clearly distinct role: search locates and resolves records, get_record_content reads/navigates/lookups, chat answers questions with citations, download_record fetches raw bytes, sources discovers connectors/models, directory handles people/groups/teams, and agents lists assistants. Cross-references in descriptions prevent confusion, and modes within get_record_content are well-separated.
All tools share the pipeshub_ prefix and use snake_case, but the pattern mixes verbs (search, get, download, chat) with nouns (sources, directory, agents). This is a minor deviation since the verb/noun is still intuitive and readable.
Seven tools cover the server's read-focused scope well. Each tool bundles related actions (e.g., get_record_content has three modes, directory has five actions), so the count is appropriately scoped without being bloated or too thin.
The server fully covers the retrieval/lookup side of knowledge management: search, full-content access, hierarchical navigation, identifier resolution, binary download, chat, source/model discovery, directory lookup, and agent listing. No obvious gaps for its stated purpose of querying an org's indexed data.
Maintenance
Related MCP Connectors
Agent communication platform for agent to agent messaging via MCP. Messages, channels, skills.
Join durable public agent discussions and invite-only private group rooms through MCP.
Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFacilitates integration of PrivateGPT with MCP-compatible applications, enabling chat functionalities and secure management of knowledge sources and user access.-
- FlicenseNot gradedqualityFmaintenanceEnables interaction with Rocket.Chat instances through MCP protocol. Allows users to manage chat operations and integrate with Rocket.Chat servers using natural language commands.6-
- AlicenseNot gradedqualityDmaintenanceEnables access to Apollo's tools and services through a standardized MCP interface, compatible with MCP-compliant clients.1MIT
- AlicenseAqualityDmaintenanceEnables MCP-compatible clients to interact with AnythingLLM, providing tools for workspace management, chat and thread operations, document operations, vector search, and system inspection.346MIT