Skip to main content
Glama
pipeshub-ai

PipesHub MCP Server

Official

PipesHub MCP 서버에 MCP 클라이언트 연결하기

이 가이드에서는 정적 OAuth 자격 증명 또는 Bearer 토큰을 사용하여 PipesHub의 원격 MCP 서버를 Cursor, Claude Code, Gemini CLI, Codex CLI, Claude.ai (Web) 및 LibreChat에 연결하는 방법을 설명합니다.

PipesHub는 /mcp에서 Streamable HTTP를 통해 원격 MCP 엔드포인트를 노출합니다. MCP 클라이언트는 이 엔드포인트에 직접 연결합니다. 로컬 npm 패키지나 stdio 프로세스가 필요 없습니다.

코딩 에이전트인가요? 코딩 에이전트용에서 시작하세요. npx skills add pipeshub-ai/mcp-server 명령으로 스킬을 사용자의 저장소에 설치하세요(skills/pipeshub 참조). 이 저장소에서 작업하는 기여자라면 AGENTS.md를 읽으세요.

도구 참조를 찾고 계신가요? MCP 서버가 노출하는 각 도구(pipeshub_chat, pipeshub_search, pipeshub_get_record_content, pipeshub_download_record, pipeshub_directory, pipeshub_sources, pipeshub_agents)에 대한 설명, 인수, 결정 가이드는 TOOLS.md를 참조하세요.

QM을 사용 중인가요? QM은 타사 MCP 엔드포인트를 연결할 수 없습니다. QM은 자체 하네스에 대한 MCP 서버이지 클라이언트가 아닙니다. QM과 함께 PipesHub 사용하기를 따르세요. qm/의 배포 계층 번들은 에이전트의 샌드박스 내에 pipeshub 명령을 제공합니다. 이 패키지는 해당 명령을 두 번째 bin으로 제공합니다.

사전 요구 사항

  • 실행 중인 PipesHub 인스턴스(자체 호스팅 또는 클라우드)

  • PipesHub에서 생성한 OAuth 앱(1단계 참조)

Related MCP server: AnythingLLM MCP Server

1단계: PipesHub에서 OAuth 앱 만들기

  1. 관리자로 PipesHub 인스턴스에 로그인합니다.

  2. 설정 > 개발자 설정 > OAuth 앱으로 이동합니다.

  3. OAuth 앱 만들기를 클릭합니다.

  4. 앱 세부 정보를 입력합니다:

    • 이름: 예: MCP Integration

    • 리디렉션 URI: 사용하려는 클라이언트의 모든 리디렉션 URI를 추가합니다:

      클라이언트

      리디렉션 URI

      Cursor

      cursor://anysphere.cursor-mcp/oauth/callback

      Claude Code

      http://localhost:<PORT>/callback (예: http://localhost:8080/callback)

      Claude.ai (Web)

      https://claude.ai/api/mcp/auth_callback

      Gemini CLI

      http://localhost:7777/oauth/callback

      LibreChat

      http://localhost:3080/api/mcp/<server-identifier>/oauth/callback

중요: MCP_SCOPES의 스코프가 OAuth 앱에 부여된 스코프와 일치해야 합니다. 불일치하면 인가 오류가 발생합니다.

  1. 앱을 저장하고 Client ID와 Client Secret을 복사합니다.

기본 스코프 사용자 지정

기본적으로 PipesHub는 /.well-known/oauth-protected-resource/mcp 검색 엔드포인트에서 일부 기본 스코프를 노출합니다. PipesHub 인스턴스에서 MCP_SCOPES 환경 변수를 설정하여 노출되는 스코프를 사용자 지정할 수 있습니다. 이는 노출된 모든 스코프를 자동으로 요청하는 Claude Code와 같은 클라이언트에 유용합니다.

자리 표시자

아래의 모든 구성에서 다음을 바꾸세요:

자리 표시자

설명

예시

PIPESHUB_INSTANCE_URL

PipesHub 인스턴스 URL

https://app.pipeshub.com

YOUR_CLIENT_ID

OAuth 앱 클라이언트 ID

clid_abc123...

YOUR_CLIENT_SECRET

OAuth 앱 클라이언트 시크릿

clsec_xyz789...

원격 MCP 엔드포인트 URL은 PIPESHUB_INSTANCE_URL/mcp입니다.


원격 MCP 설정

Cursor는 mcp.json의 auth 객체를 통해 원격 MCP 서버에 대한 정적 OAuth를 지원합니다.

구성

Cursor 설정 > 도구 및 통합 > 새 MCP 서버를 열거나 프로젝트의 .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는 PipesHub의 /.well-known/oauth-protected-resource/mcp 메타데이터를 통해 인가 및 토큰 엔드포인트를 자동으로 검색합니다.

참고: scopes 필드를 생략하면 Cursor는 /.well-known/oauth-protected-resource/mcp를 가져와 여기에 나열된 모든 scopes_supported를 요청합니다. 액세스를 제한하려면 필요한 스코프만 명시적으로 나열하세요. 서버 측에서 노출되는 스코프를 제어할 수도 있습니다. 기본 스코프 사용자 지정을 참조하세요.

환경 변수 사용

Cursor의 ${env:VAR} 보간을 사용하여 비밀을 구성 파일 밖에 보관하세요:

{
  "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"
        ]
      }
    }
  }
}

리디렉션 URI

Cursor는 모든 MCP 서버에 대해 고정된 리디렉션 URI를 사용합니다:

cursor://anysphere.cursor-mcp/oauth/callback

PipesHub에서 OAuth 앱을 만들 때 이 URI를 허용된 리디렉션 URI로 등록하세요.

OAuth 로그인 문제 해결

Cursor의 내부 브라우저가 OAuth 로그인 페이지를 로드하지 못하면 내부 브라우저에서 인가 URL을 복사하여 일반 브라우저에 붙여넣어 로그인 흐름을 완료하세요.

Claude Code는 --client-id, --client-secret, --callback-port를 통해 정적 OAuth 자격 증명으로 원격 HTTP MCP 서버를 지원합니다.

PipesHub는 /.well-known/oauth-protected-resource/mcp에서 검색을 노출하므로 Claude Code가 인가 및 토큰 엔드포인트를 자동으로 검색합니다.

중요: Claude Code는 특정 스코프 구성을 지원하지 않습니다. /.well-known/oauth-protected-resource/mcp를 가져와 scopes_supported 목록을 읽고 모두 요청합니다. PipesHub의 OAuth 앱은 검색 엔드포인트에 나열된 모든 스코프에 대한 액세스 권한이 있어야 합니다. 그렇지 않으면 인가 요청이 실패합니다. 노출되는 스코프를 제한하려면 기본 스코프 사용자 지정을 참조하세요.

CLI로 추가

claude mcp add --transport http \
  --client-id YOUR_CLIENT_ID \
  --client-secret \
  --callback-port 8080 \
  pipeshub PIPESHUB_INSTANCE_URL/mcp

값 없이 --client-secret을 사용하면 마스킹된 입력을 묻는 메시지가 표시됩니다. 프롬프트를 건너뛰려면 MCP_CLIENT_SECRET 환경 변수를 설정하세요:

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

모든 프로젝트에서 사용할 수 있게 하려면:

claude mcp add --transport http --scope user \
  --client-id YOUR_CLIENT_ID \
  --client-secret \
  --callback-port 8080 \
  pipeshub PIPESHUB_INSTANCE_URL/mcp

JSON으로 추가

claude mcp add-json pipeshub '{
  "type": "http",
  "url": "PIPESHUB_INSTANCE_URL/mcp",
  "oauth": {
    "clientId": "YOUR_CLIENT_ID",
    "callbackPort": 8080
  }
}' --client-secret

프로젝트 범위 (.mcp.json)

프로젝트 루트에 .mcp.json 파일을 만드세요. 이 파일은 버전 관리에 커밋할 수 있습니다(비밀은 환경 변수로 유지).

{
  "mcpServers": {
    "pipeshub": {
      "type": "http",
      "url": "${PIPESHUB_INSTANCE_URL}/mcp",
      "oauth": {
        "clientId": "${PIPESHUB_CLIENT_ID}",
        "callbackPort": 8080
      }
    }
  }
}

Claude Code를 시작하기 전에 환경 변수를 설정하세요:

export PIPESHUB_INSTANCE_URL="https://app.pipeshub.com"
export PIPESHUB_CLIENT_ID="your-client-id"

참고: 클라이언트 시크릿은 구성 파일이 아닌 시스템 키체인에 저장됩니다. /mcp로 처음 인증할 때 입력하라는 메시지가 표시됩니다.

인증

서버를 추가한 후 Claude Code에서 /mcp를 실행하고 브라우저 로그인 흐름을 따르세요. 토큰은 안전하게 저장되고 자동으로 갱신됩니다.

확인

claude mcp list
claude mcp get pipeshub

Gemini CLI는 기본값인 dynamic_discovery를 통해 OAuth로 원격 MCP 서버를 지원합니다. 이는 PipesHub의 /.well-known/oauth-protected-resource/mcp에서 인가 및 토큰 엔드포인트를 자동으로 검색합니다.

옵션 A: 설정 파일

~/.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"
        ]
      }
    }
  }
}

참고: scopes 목록을 OAuth 앱에 부여된 범위와 일치하도록 조정하세요. 도구의 일부만 필요하면 그에 따라 스코프를 제한할 수 있습니다.

옵션 B: CLI 명령

gemini mcp add --transport http pipeshub PIPESHUB_INSTANCE_URL/mcp

그런 다음 ~/.gemini/settings.json을 편집하여 위와 같이 oauth 블록을 추가하세요.

인증

Gemini CLI 내에서 /mcp auth 명령을 사용하세요:

# 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 pipeshub

첫 연결 시 Gemini는 401 응답을 자동으로 감지하고 OAuth 엔드포인트를 검색한 후 로그인용 브라우저를 엽니다. 토큰은 ~/.gemini/mcp-oauth-tokens.json에 안전하게 저장되고 자동으로 갱신됩니다.

서버 관리

# List all configured servers
gemini mcp list

# Remove the server
gemini mcp remove pipeshub

# Temporarily disable/enable
gemini mcp disable pipeshub
gemini mcp enable pipeshub

OAuth 구성 속성

속성

필수

설명

clientId

예

PipesHub의 OAuth 2.0 클라이언트 ID

clientSecret

아니요

OAuth 2.0 클라이언트 시크릿(기밀 클라이언트용)

scopes

아니요

요청할 OAuth 스코프

authorizationUrl

아니요

인가 엔드포인트 재정의(기본적으로 자동 검색)

tokenUrl

아니요

토큰 엔드포인트 재정의(기본적으로 자동 검색)

redirectUri

아니요

리디렉션 URI 재정의(기본값은 http://localhost:7777/oauth/callback)

참고: OAuth에는 로컬 브라우저가 필요합니다. 헤드리스 환경, X11 포워딩이 없는 원격 SSH, 브라우저 접근이 없는 컨테이너에서는 작동하지 않습니다.

Codex CLI(OpenAI Codex)는 Streamable HTTP를 통해 원격 MCP 서버에 연결하며, ~/.codex/config.toml(또는 프로젝트별로 범위를 지정하려면 프로젝트 루트의 .codex/config.toml)의 [mcp_servers.<name>] 테이블로 구성합니다. Codex의 HTTP 전송은 환경 변수에서 읽은 Bearer 토큰으로 인증하므로 PipesHub JWT Bearer 토큰을 전달하세요.

[mcp_servers.pipeshub]
url = "PIPESHUB_INSTANCE_URL/mcp"
bearer_token_env_var = "PIPESHUB_BEARER_TOKEN"

bearer_token_env_var는 토큰을 보관하는 환경 변수의 이름입니다. Codex를 시작하기 전에 내보내세요:

export PIPESHUB_BEARER_TOKEN="YOUR_BEARER_TOKEN"

토큰은 Bearer 키워드가 없는 원시 JWT입니다.

또는 CLI로 추가할 수 있습니다:

codex mcp add pipeshub \
  --url PIPESHUB_INSTANCE_URL/mcp \
  --bearer-token-env-var PIPESHUB_BEARER_TOKEN

--bearer-token-env-var는 토큰 값 자체가 아니라 토큰을 보관하는 환경 변수의 이름을 받습니다.

확인

# List configured MCP servers
codex mcp list

# Inside the Codex TUI, view server status and available tools
/mcp

Claude.ai는 원격 MCP 서버를 통한 사용자 지정 커넥터를 지원합니다. 이를 통해 로컬 설정 없이 Claude.ai 웹 인터페이스에서 PipesHub 도구를 직접 사용할 수 있습니다.

참고: 이 기능은 현재 베타 버전입니다. 무료 요금제 사용자는 사용자 지정 커넥터를 하나만 사용할 수 있습니다.

Claude.ai 커넥터 설정

Claude.ai 사용자 지정 커넥터 추가 대화상자

개인 사용자(Pro / Max 요금제)의 경우

  1. claude.ai로 이동하여 설정 > 커넥터로 이동합니다.

  2. 커넥터 섹션 하단의 사용자 지정 커넥터 추가를 클릭합니다.

  3. MCP 서버 URL을 입력합니다:

    PIPESHUB_INSTANCE_URL/mcp
  4. 고급 설정을 클릭하고 OAuth 자격 증명을 입력합니다:

    • OAuth 클라이언트 ID: YOUR_CLIENT_ID

    • OAuth 클라이언트 시크릿: YOUR_CLIENT_SECRET

  5. 추가를 클릭합니다.

  6. 인증하고 권한을 부여하기 위해 PipesHub의 로그인 페이지로 리디렉션됩니다.

  7. 인증이 완료되면 커넥터가 활성화되고 PipesHub 도구를 Claude.ai 대화에서 사용할 수 있습니다.

팀 / 엔터프라이즈 요금제의 경우

조직 소유자가 먼저 커넥터를 추가해야 합니다:

  1. 조직 설정 > 커넥터로 이동합니다.

  2. 사용자 지정 커넥터 추가를 클릭합니다.

  3. MCP 서버 URL을 입력합니다: PIPESHUB_INSTANCE_URL/mcp

  4. 고급 설정을 클릭하고 OAuth 클라이언트 ID와 클라이언트 시크릿을 입력합니다.

  5. 추가를 클릭합니다.

그런 다음 팀 구성원이 연결할 수 있습니다:

  1. 설정 > 커넥터로 이동합니다.

  2. PipesHub 커넥터("Custom" 레이블이 표시됨)를 찾습니다.

  3. 연결을 클릭하여 PipesHub의 OAuth 로그인으로 인증합니다.

리디렉션 URI

Claude.ai는 OAuth에 다음 리디렉션 URI를 사용합니다:

https://claude.ai/api/mcp/auth_callback

PipesHub OAuth 앱에서 이 URI를 허용된 리디렉션 URI로 등록하세요.

보안 참고 사항

  • 신뢰할 수 있는 MCP 서버에만 연결하세요.

  • OAuth 인증 흐름 중에 요청되는 권한을 검토하세요.

  • Claude.ai는 부여된 OAuth 토큰을 사용하여 사용자를 대신해 PipesHub와 상호작용합니다. 비밀번호가 공유되는 일은 없습니다.

LibreChat은 사용자 지정 커넥터 UI를 통해 OAuth 인증으로 원격 MCP 서버를 지원합니다. 이를 통해 PipesHub 도구를 LibreChat 인스턴스에서 사용 가능한 모든 모델에 연결할 수 있습니다.

LibreChat MCP 구성

구성

  1. LibreChat 인스턴스에 로그인합니다

  2. MCP Servers 설정 패널로 이동합니다

  3. Add를 클릭하여 새 사용자 지정 MCP 커넥터를 생성합니다

  4. 커넥터 세부 정보를 입력합니다:

    • Name: Pipeshub (또는 원하는 이름)

    • MCP Server URL: PIPESHUB_INSTANCE_URL/mcp

    • Transport: Streamable HTTPS 선택

    • Authentication: OAuth 선택

  5. OAuth 자격 증명을 입력합니다:

    • Client ID: YOUR_CLIENT_ID

    • Client Secret: YOUR_CLIENT_SECRET

    • Authorization URL: PIPESHUB_INSTANCE_URL/api/v1/oauth2/authorize

    • Token URL: PIPESHUB_INSTANCE_URL/api/v1/oauth2/token

    • Scope: openid email (또는 필요에 따라 추가 범위)

  6. I trust this application을 체크합니다

  7. Add를 클릭하여 커넥터를 저장합니다

  8. 추가 후 LibreChat은 커넥터 설정 패널(복사 버튼 옆)에 표시되는 Redirect URI를 생성합니다. 형식은 다음과 같습니다:

    http://localhost:3080/api/mcp/<server-identifier>/oauth/callback
  9. Redirect URI를 복사하여 PipesHub OAuth 앱의 허용된 리디렉션 URI로 등록합니다 (1단계 참조)

  10. LibreChat 커넥터로 돌아가 Update를 클릭하여 OAuth 흐름을 시작합니다 — PipesHub의 로그인 페이지로 리디렉션되어 인증 및 권한을 부여하게 됩니다

Redirect URI

LibreChat은 커넥터가 생성된 후에 리디렉션 URI를 생성합니다. URI 형식은 다음과 같습니다:

http://localhost:3080/api/mcp/<server-identifier>/oauth/callback

여기서 <server-identifier>는 LibreChat이 할당한 고유 식별자입니다(커넥터 설정 상단에 "Unique Server Identifier"로 표시됨). 이 URI를 복사하여 인증 전에 PipesHub OAuth 앱의 허용된 리디렉션 URI에 추가해야 합니다.

참고: LibreChat 인스턴스가 다른 호스트나 포트에서 실행되는 경우 URI도 그에 맞게 반영됩니다 (예: https://chat.example.com/api/mcp/pipeshub/oauth/callback).

Scopes

LibreChat은 Scope 필드에서 OAuth 범위를 지정할 수 있습니다. 공백으로 구분된 목록을 사용하세요:

openid email

PipesHub 전용 범위를 요청하려면 범위 필드에 추가하세요:

openid email org:read kb:read kb:write semantic:read conversation:read conversation:write conversation:chat agent:read agent:execute

참고: 요청하는 범위는 PipesHub에서 OAuth 앱에 부여된 범위와 일치해야 합니다. 자세한 내용은 기본 범위 사용자 지정을 참조하세요.


로컬 MCP 서버 (Stdio)

PipesHub의 원격 MCP 엔드포인트에 연결하는 대신, @pipeshub-ai/mcp npm 패키지를 사용하여 MCP 서버를 로컬 stdio 프로세스로 실행할 수 있습니다. 이는 로컬 설정을 선호하거나 원격 MCP 엔드포인트에 대한 직접 HTTP 연결이 실용적이지 않은 환경에서 작업해야 하는 경우 유용합니다.

사전 요구 사항

  • Node.js 18+ 설치

  • PipesHub 인스턴스 URL

  • 인증 자격 증명: Bearer 토큰 (JWT) 또는 OAuth Client ID + Secret

Placeholders

아래 모든 구성에서 다음을 바꾸세요:

Placeholder

설명

예시

PIPESHUB_INSTANCE_URL

PipesHub 인스턴스 URL

https://app.pipeshub.com

YOUR_BEARER_TOKEN

인증용 JWT Bearer 토큰

eyJhbGci...

YOUR_CLIENT_ID

OAuth 앱 클라이언트 ID

clid_abc123...

YOUR_CLIENT_SECRET

OAuth 앱 클라이언트 시크릿

clsec_xyz789...

Claude Desktop 설정(claude_desktop_config.json)에서 구성합니다:

{
  "mcpServers": {
    "pipeshub": {
      "command": "npx",
      "args": [
        "@pipeshub-ai/mcp",
        "start",
        "--server-url",
        "PIPESHUB_INSTANCE_URL",
        "--bearer-auth",
        "YOUR_BEARER_TOKEN"
      ]
    }
  }
}

OAuth 자격 증명 사용:

{
  "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"
      ]
    }
  }
}

Cursor Settings > Tools and Integrations > New MCP Server를 열거나 프로젝트의 .cursor/mcp.json을 편집합니다:

{
  "mcpServers": {
    "pipeshub": {
      "command": "npx",
      "args": [
        "@pipeshub-ai/mcp",
        "start",
        "--server-url",
        "PIPESHUB_INSTANCE_URL",
        "--bearer-auth",
        "YOUR_BEARER_TOKEN"
      ]
    }
  }
}

OAuth 자격 증명 사용:

{
  "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_TOKEN

OAuth 자격 증명 사용:

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/token
gemini mcp add pipeshub -- npx -y @pipeshub-ai/mcp start \
  --server-url PIPESHUB_INSTANCE_URL \
  --bearer-auth YOUR_BEARER_TOKEN

OAuth 자격 증명 사용:

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/token

MCP 서버를 로컬 stdio 프로세스로 실행하고, OAuth 앱의 Client ID와 Secret(client_credentials 권한 부여)으로 인증합니다. ~/.codex/config.toml(또는 프로젝트 루트의 .codex/config.toml)을 편집합니다:

[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",
]

참고:

  • --server-url은 /api/v1을 포함해야 합니다.

  • --token-url /api/v1/oauth2/token이 필요합니다.

또는 JWT Bearer 토큰으로 인증합니다:

[mcp_servers.pipeshub]
command = "npx"
args = [
  "-y",
  "@pipeshub-ai/mcp",
  "start",
  "--server-url",
  "PIPESHUB_INSTANCE_URL/api/v1",
  "--bearer-auth",
  "YOUR_BEARER_TOKEN",
]

명령 팔레트를 열고 MCP: Open User Configuration을 선택한 후 다음을 추가합니다:

{
  "mcpServers": {
    "pipeshub": {
      "command": "npx",
      "args": [
        "@pipeshub-ai/mcp",
        "start",
        "--server-url",
        "PIPESHUB_INSTANCE_URL",
        "--bearer-auth",
        "YOUR_BEARER_TOKEN"
      ]
    }
  }
}

Windsurf Settings > Cascade > Manage MCPs > View raw config를 열고 다음을 추가합니다:

{
  "mcpServers": {
    "pipeshub": {
      "command": "npx",
      "args": [
        "@pipeshub-ai/mcp",
        "start",
        "--server-url",
        "PIPESHUB_INSTANCE_URL",
        "--bearer-auth",
        "YOUR_BEARER_TOKEN"
      ]
    }
  }
}

npm 패키지 대신 클론된 저장소에서 로컬 MCP 서버를 실행하려면:

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_TOKEN

MCP 클라이언트 구성에서 npx @pipeshub-ai/mcp를 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"
      ]
    }
  }
}

MCP Inspector로 디버깅하려면:

npx @modelcontextprotocol/inspector node ./bin/mcp-server.js start --server-url PIPESHUB_INSTANCE_URL --bearer-auth YOUR_BEARER_TOKEN

CLI 도움말

서버 인수의 전체 목록:

npx @pipeshub-ai/mcp --help

작동 방식

아키텍처

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 보호 리소스 검색

PipesHub는 다음 위치에서 OAuth 보호 리소스 검색을 제공합니다:

PIPESHUB_INSTANCE_URL/.well-known/oauth-protected-resource/mcp

이것은 모든 OAuth 엔드포인트를 자동으로 반환합니다:

  • Authorization: PIPESHUB_INSTANCE_URL/api/v1/oauth2/authorize

  • Token: PIPESHUB_INSTANCE_URL/api/v1/oauth2/token

  • Revocation: PIPESHUB_INSTANCE_URL/api/v1/oauth2/revoke

  • JWKS: PIPESHUB_INSTANCE_URL/.well-known/jwks.json


문제 해결

"Incompatible auth server: does not support dynamic client registration"

이 오류는 클라이언트가 사전 구성된 자격 증명 대신 동적 등록을 시도하고 있음을 의미합니다. --client-id 및 --client-secret(Claude Code) 또는 auth 객체(Cursor)를 올바르게 전달했는지 확인하세요.

인증 실패 / 리디렉션 오류

  • OAuth 앱의 Redirect URI가 클라이언트가 사용하는 URI와 정확히 일치하는지 확인하세요:

    • Cursor: cursor://anysphere.cursor-mcp/oauth/callback

    • Claude Code: http://localhost:<callbackPort>/callback

    • Claude.ai: https://claude.ai/api/mcp/auth_callback

    • Gemini CLI: http://localhost:7777/oauth/callback

    • LibreChat: http://localhost:3080/api/mcp/<server-identifier>/oauth/callback

  • OAuth 앱이 PipesHub에서 활성 상태인지(일시 중지되지 않았는지) 확인하세요

MCP 엔드포인트에 연결할 수 없음

  • 엔드포인트에 접근 가능한지 확인하세요: curl -X POST PIPESHUB_INSTANCE_URL/mcp (연결 오류가 아닌 401이 반환되어야 함)

  • PipesHub 인스턴스에서 MCP가 활성화되어 있는지 확인하세요

MCP Inspector로 디버깅

npx @modelcontextprotocol/inspector

그런 다음 Bearer 토큰으로 PIPESHUB_INSTANCE_URL/mcp에 연결하여 엔드포인트를 직접 테스트합니다.


FAQ

  1. PipesHub 인스턴스의 MCP_SCOPES 환경 변수를 업데이트하여 검색 엔드포인트를 통해 노출할 새 범위를 포함시킵니다.

  2. PipesHub에서 OAuth 앱 범위를 업데이트합니다: Settings > Developer Settings > OAuth Apps로 이동하여 OAuth 앱을 선택하고 필요에 따라 범위를 추가하거나 제거합니다.

  3. 클라이언트를 다시 인증합니다 — 기존 토큰에는 이전 범위가 포함되어 있으므로 업데이트된 범위로 새 토큰을 받으려면 다시 인증해야 합니다. 예:

    • Cursor: MCP 서버를 제거하고 다시 추가하거나 캐시된 OAuth 토큰을 지우고 다시 연결합니다.

    • Claude Code: /mcp를 실행하고 브라우저 로그인 흐름을 다시 완료합니다.

    • Gemini CLI: /mcp auth pipeshub를 실행하여 다시 인증합니다.

    • Codex CLI: PIPESHUB_BEARER_TOKEN을 새 토큰으로 업데이트하고 Codex를 다시 시작합니다.

    • Claude.ai: Settings > Connectors에서 커넥터를 연결 해제하고 다시 연결합니다.

Available Tools

7 tools
pipeshub_agentsA
Read-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 } where name is the connector (e.g. jira, gmail) and tools are 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoOptional case-insensitive substring match across agent name, description, and tags. Omit to return every agent.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_content mode:"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_search for the recordId, then mode:"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 (then pipeshub_download_record if the user wants the bytes).

Conversation lifecycle — one tool, both start and continue:

  • First turn: omit conversationId. The server creates a new conversation; capture conversationId from the response.

  • Follow-up turn: pass the conversationId from the previous response. Server-side context is preserved — do NOT replay earlier messages, and filters is 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe user's question or message for this turn.
agentIdNoOptional 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.
filtersNoWhich sources the answer may use. Leave out to use all sources. Only works on the FIRST turn; later turns keep the first turn's sources.
chatModeNoResponse 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.
modelKeyNoModel id to use (from `pipeshub_sources` `llmModels[*].modelKey`). Defaults to the org's default LLM.
modelNameNo
conversationIdNoExisting 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.
modelFriendlyNameNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), the description discloses key behavioral traits: it only reads retrieved passages, never full documents or complete lists; it undercounts and will not say so; filters are ignored on follow-ups; server-side context is preserved so earlier messages must not be replayed. These are critical limitations not captured by annotations, and they directly inform agent decision-making. No contradictions 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but meticulously structured: core purpose first, then a highlighted 'Three questions this tool gets WRONG' section, followed by 'Everything else... belongs here', internal vs web search, conversation lifecycle, and response handling. Each section is front-loaded with the most important caveats, and every sentence provides actionable guidance. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all aspects needed to use the tool correctly: its scope and limitations, the routing to alternative tools, the distinction between chat modes, the conversation lifecycle, parameter usage, and how to handle the response (capture conversationId, use citations to download documents). No output schema exists, but the description explains the response contains 'answer' plus 'citations'. It is complete for a chat tool with this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 75%, the description adds substantial semantic depth to parameters. For chatMode it explains the valid values depend on agentId, and that 'quick' is sent automatically when agentId is set. For conversationId it clarifies the lifecycle (omit on first turn, pass on follow-ups, when to re-omit). For filters it notes they only work on the first turn. It also explains how to obtain agentId from pipeshub_agents, and modelKey from pipeshub_sources. This goes far beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Ask a question, get an answer grounded in the org's indexed data with citations.' It also explicitly states what it reads ('a few retrieved passages — never a whole document, never a complete list'), which clearly scopes the tool. It further differentiates itself from siblings by naming three categories of questions it handles poorly and directing to the correct alternatives, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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 question types (structure, exhaustive, one named document) and directs to specific sibling tools, then enumerates what belongs here (policies, processes, decisions, history). It also distinguishes internal_search vs web_search, explains agent chat modes, and gives a complete conversation lifecycle (first turn vs follow-up, when to restart). No ambiguity remains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pipeshub_directoryA
Read-onlyIdempotent

Look up people, groups, and teams in PipesHub. Five actions — pick action. Not for documents or files: that is pipeshub_search.

  • whoami — the caller's id, email, full name. Use before get_user on yourself. Errors if the credential is expired or revoked.

  • list_users — page org users; search matches name or email.

  • get_user — full User for one userId.

  • list_groups — org groups with userCount; search matches name.

  • list_my_teams — teams the caller is on, with canEdit / canDelete / canManageMembers; search matches name.

Omit page/limit for the first page (page 1). No match is an empty users/groups/teams array, not an error. pagination.hasNextPage (teams: hasNext) says whether to request the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page for list_* actions. Omit for page 1.
limitNoItems per page for list_* (1–100). Omit for the action default: 50 users, 25 groups, 100 teams.
actionYesWhat 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`). Optional `search` matches group name. - `list_my_teams` — teams the authenticated user belongs to, with capability flags. Optional `search` matches team name.
searchNoSubstring match on list_users (name or email), list_groups (name), and list_my_teams (name). An empty list means no match, not an error.
userIdNoRequired when `action` is `get_user`. 24-character ObjectId. Take it from `whoami` (yourself) or from a `list_users` hit.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint, but the description adds significant behavioral context: error on expired/revoked credential for whoami, empty arrays for no matches, pagination via hasNextPage/hasNext, and page/limit defaults. No contradictions; the description enriches beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a clear opening, bulleted action list, and concise pagination/error notes. Every sentence adds value; no fluff. Front-loaded with the primary purpose and sibling differentiation, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all actions, parameters, error conditions, pagination, and alternatives. Even without an output schema, it describes return arrays (users/groups/teams) and capability flags. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters at 100%, so baseline is 3. The description adds cross-parameter dependencies (userId required for get_user, search only applies to list_* actions), clarifies action-specific requirements, and explains pagination behavior. This goes beyond schema, but the schema already provides solid descriptions, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Look up people, groups, and teams in PipesHub.' Lists five distinct actions and explicitly differentiates from pipeshub_search for documents/files. An agent can immediately understand scope and distinguish from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Not for documents or files: that is pipeshub_search,' naming the alternative and when not to use this tool. Also provides per-action guidance, e.g., 'Use before get_user on yourself' and explains pagination defaults and error behavior. Clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pipeshub_download_recordA
Read-onlyIdempotent

Download the file as stored for one record — not PipesHub's parsed content, metadata header, or summary.

Use this when the user wants the file itself (download, attach, open). Get recordId from a chat citation or a pipeshub_search hit.

Do not use this to read, summarize, or answer "what does this doc say?" regardless of format. That is pipeshub_get_record_content mode:"content". Text formats come back inline; images, audio, and binary as base64.

convertTo accepts only application/pdf; anything else is ignored.

ParametersJSON Schema
NameRequiredDescriptionDefault
recordIdYesRecord 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.
convertToNoThe only conversion target connectors honour is `application/pdf` (the MIME type, not `pdf`). A bare `pdf` is ignored and the original file is returned with no error. Omit for the file as stored. Does not parse the document — use `pipeshub_get_record_content` `mode:"content"` for that.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description doesn't need to restate safety. It adds valuable behavioral context: conversion behavior (only application/pdf accepted, bare 'pdf' ignored), output encoding (text inline, binary as base64), and the distinction between stored file and parsed content. No contradiction with annotations. The only minor omission is lack of error handling detail, but that is beyond typical expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence serves a distinct purpose: purpose, usage, exclusions, and conversion behavior. It is front-loaded with the core purpose and keeps exclusions and details in later sentences. No filler or redundant phrasing; it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a download tool with two parameters and no output schema, the description covers everything an agent needs: how to obtain the recordId, what convertTo accepts, output encoding, and what this tool is not for. The sibling references complete the routing. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented. The description adds value beyond the schema: for recordId, it reiterates the source (citation or search) and clarifies the format expectation; for convertTo, it explains that only 'application/pdf' is honored and that 'pdf' is silently ignored. This extra context helps the agent avoid common mistakes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific verb and resource: 'Download the file as stored for one record'. It explicitly contrasts with parsed content, metadata header, and summary, and names the sibling tool for reading content. This fully distinguishes it from pipeshub_get_record_content without needing to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use guidance ('Use this when the user wants the file itself') and when-not-to-use ('Do not use this to read, summarize, or answer...'), and points to the correct alternative (pipeshub_get_record_content mode:"content"). It also tells the agent where to obtain recordId, leaving no ambiguity about invocation context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pipeshub_get_record_contentA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo`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
pageNoPage number, 1-indexed.
depthNoLevels 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`.
limitNoChildren per page. The minimum is 50 — smaller values are rejected rather than silently raised.
nodeIdNoThe 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.
recordIdNoRecord 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`.
nodeTypesNoRestrict children to these node types, e.g. `["record", "folder"]`.
identifiersNoThe 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`.
createdAfterNoFilter 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.
connectorNameNoOptional 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.
createdBeforeNoFilter children by source creation time. `YYYY-MM-DD` is inclusive of the whole day.
modifiedAfterNoFilter children by source modification time. Same formats as `createdAfter`.
modifiedBeforeNoFilter children by source modification time. Same formats as `createdBefore`.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_sourcesA
Read-onlyIdempotent

Discover available chat sources and AI models in one call.

Returns up to three sections:

  • sources — connectors (kind: "connector") and collections (kind: "knowledgeBase"). For pipeshub_search and pipeshub_chat, put a connector id in apps and a collection id in kb. sourcesTruncated: true means the list stopped at 1,000 sources.

  • llmModels — chat / generation models. Each item's modelKey is the value to pass on pipeshub_chat as modelKey. Pick isDefault: true unless the user asks for a specific model.

  • embeddingModels — vector embedding models (only fetched when explicitly requested via include).

Call this once at the start of a session and cache the result — sources and models change infrequently.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoWhich sections to fetch. Default: `["sources", "llmModels"]`. Add `embeddingModels` if the user is configuring re-embedding.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context beyond that: the 1,000-source truncation flag, conditional embedding-model fetching, and caching advice. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the one-line purpose, then organized into clear bullets for each section. Every sentence earns its place; there is no filler or repetition of annotation data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with zero required parameters, no output schema, and comprehensive annotations, the description covers all critical information: what sections exist, their contents, defaults, truncation semantics, downstream usage, and caching recommendation. Nothing necessary for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already documents the include enum with a default, the description enriches meaning by showing how each section is consumed elsewhere (connector ids in apps, collection ids in kb, modelKey on chat, isDefault selection). This goes beyond the schema's basic parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Discover available chat sources and AI models in one call.' It then enumerates the three returned sections, each tied to concrete downstream use (e.g., modelKey for pipeshub_chat), clearly distinguishing this discovery 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit usage guidance: 'Call this once at the start of a session and cache the result' and says to add embeddingModels only when configuring re-embedding. It also explains how returned ids and modelKeys flow into pipeshub_search and pipeshub_chat, so an agent knows exactly when to invoke this tool.

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.

  1. 1 tool updatev2.4.2
    • Changedpipeshub_directory5 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"What to do:\n- `whoami` — return the authenticated user's identity, confirmed against the server. No other args needed.\n- `list_users` — paginated list of org users. Optional `page`, `limit`, `search` (substring match against name or email).\n- `get_user` — full profile for one user. Required `userId`. Use `whoami` to find your own id first if needed.\n- `list_groups` — paginated list of user groups (with `userCount`).\n- `list_my_teams` — teams the authenticated user belongs to, with capability flags."New value: +"What to do:\n- `whoami` — return the authenticated user's identity, confirmed against the server. No other args needed.\n- `list_users` — paginated list of org users. Optional `page`, `limit`, `search` (substring match against name or email).\n- `get_user` — full profile for one user. Required `userId`. Use `whoami` to find your own id first if needed.\n- `list_groups` — paginated list of user groups (with `userCount`). Optional `search` matches group name.\n- `list_my_teams` — teams the authenticated user belongs to, with capability flags. Optional `search` matches team name."
      • changedInput schema / properties / limit / description
        Previous value: -"Pagination — items per page. Used by list_* actions."New value: +"Items per page for list_* (1–100). Omit for the action default: 50 users, 25 groups, 100 teams."
      • changedInput schema / properties / page / description
        Previous value: -"Pagination — 1-based page number. Used by list_* actions."New value: +"1-based page for list_* actions. Omit for page 1."
      • changedInput schema / properties / search / description
        Previous value: -"Substring match against name / email. Used by list_users."New value: +"Substring match on list_users (name or email), list_groups (name), and list_my_teams (name). An empty list means no match, not an error."
      • changedInput schema / properties / userId / description
        Previous value: -"Required when `action` is `get_user`. 24-character ObjectId."New value: +"Required when `action` is `get_user`. 24-character ObjectId. Take it from `whoami` (yourself) or from a `list_users` hit."
  2. 3 tool updatesv2.4.1
    • Changedpipeshub_chat3 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Source scoping for retrieval. Pass `apps` ids from `pipeshub_sources`. Only meaningful on the FIRST turn (when starting a new conversation)."New value: +"Which sources the answer may use. Leave out to use all sources. Only works on the FIRST turn; later turns keep the first turn's sources."
      • changedInput schema / properties / filters / properties / apps / description
        Previous value: -"Source-scoping ids from `pipeshub_sources` — connector instance and / or knowledge base ids, mixed freely. The legacy org-wide `knowledgeBase_<orgId>` id is still accepted on deployments that predate per-KB sources. Empty / omitted means no app-side restriction."New value: +"Connector ids to use. Get them from `pipeshub_sources`, where `kind` is \"connector\". Collection ids go in `kb`, not here."
      • changedInput schema / properties / filters / properties / kb / description
        Previous value: -"Legacy / unused. Leave empty."New value: +"Collection (knowledge base) ids to use. Get them from `pipeshub_sources`, where `kind` is \"knowledgeBase\"."
    • Changedpipeshub_download_record1 field changed
      • changedInput schema / properties / convertTo / description
        Previous value: -"Optional server-side format conversion target (e.g. `pdf`). When omitted, the original file bytes are returned."New value: +"The only conversion target connectors honour is `application/pdf` (the MIME type, not `pdf`). A bare `pdf` is ignored and the original file is returned with no error. Omit for the file as stored. Does not parse the document — use `pipeshub_get_record_content` `mode:\"content\"` for that."
    • Changedpipeshub_search3 fields changed
      • changedInput schema / properties / apps / description
        Previous value: -"Source-scoping ids — connector instance UUIDs and / or `knowledgeBase_<orgId>`. Get them from `pipeshub_sources`."New value: +"Connector ids to search (for example a Jira or Google Drive connection). Get them from `pipeshub_sources`, where `kind` is \"connector\". Collection ids go in `kb`, not here."
      • addedInput schema / properties / kb
        Added value: +{
        +  "description": "Collection (knowledge base) ids to search. Get them from `pipeshub_sources`, where `kind` is \"knowledgeBase\".",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"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."New value: +"Number of results. Default 10. Use 5–10 when you only need a `recordId`."
  3. 7 tool updatesv2.3.3
    • First observedpipeshub_agents
    • First observedpipeshub_chat
    • First observedpipeshub_directory
    • First observedpipeshub_download_record
    • First observedpipeshub_get_record_content
    • First observedpipeshub_search
    • First observedpipeshub_sources

TDQS

A4.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct operation: search locates records, chat answers grounded questions, get_record_content reads full text/navigates/looks up, download_record fetches original bytes, and agents/directory/sources handle their own domains. The descriptions explicitly cross-reference and warn against misuse, so an agent can reliably select the right tool.

Naming Consistency3/5

All tools share the pipeshub_ prefix, but the pattern after it is inconsistent: some are verb_noun (download_record, get_record_content), some are bare verbs (search, chat), and some are bare nouns (agents, directory, sources). This makes names individually readable but not predictably derivable.

Tool Count5/5

Seven tools is a well-scoped size for a knowledge retrieval and chat server. Each tool covers a major capability without unnecessary fragmentation, and no tool feels redundant.

Completeness5/5

The surface covers the full read-side workflow: discover sources, search, chat with citations, resolve external references, read full content, navigate hierarchy, download files, and look up agents and people. There are no obvious gaps or dead ends for the server's apparent purpose.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers