airbyte_ops_mcp.mcp.people_lookup

MCP tools for internal team roster lookup.

This module exposes people lookup operations as MCP tools for AI agents. These are thin wrappers around the core functions in internal_team_roster module.

MCP reference

MCP primitives registered by the people_lookup module of the airbyte-internal-ops server: 2 tool(s), 0 prompt(s), 0 resource(s).

Tools (2)

list_team_roster

Hints: read-only · idempotent

List the full Airbyte internal team roster.

Returns all members from the daily-generated roster artifact. The roster is sorted by Slack display name for easy scanning. Use lookup_person for targeted searches instead of scanning the full list.

Parameters:

_No parameters._

Show input JSON schema

{
  "additionalProperties": false,
  "properties": {},
  "type": "object"
}

Show output JSON schema

{
  "description": "Response listing the full internal team roster.",
  "properties": {
    "total_members": {
      "description": "Total number of members in the roster",
      "type": "integer"
    },
    "members": {
      "description": "All person records in the roster",
      "items": {
        "description": "A person in the internal team roster.",
        "properties": {
          "slack_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Slack user ID"
          },
          "slack_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Slack display name"
          },
          "slack_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Email address from Slack profile"
          },
          "github_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "GitHub numeric user ID"
          },
          "github_handle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "GitHub username"
          },
          "github_public_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Public email from GitHub profile"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "total_members",
    "members"
  ],
  "type": "object"
}

lookup_person

Hints: read-only · idempotent

Look up a person in the Airbyte internal team roster.

Searches the daily-generated roster artifact by any field value. The roster is built from Slack and GitHub org membership data, cross-referenced by email address.

Use this to find someone's Slack ID for messaging, GitHub handle for code review, or to cross-reference identities across platforms.

Parameters:

Name Type Required Default Description
query string yes Search query to match against any field: email address, Slack display name, Slack user ID, GitHub handle, or GitHub user ID. Case-insensitive partial matching for strings, exact match for numeric IDs.

Show input JSON schema

{
  "additionalProperties": false,
  "properties": {
    "query": {
      "description": "Search query to match against any field: email address, Slack display name, Slack user ID, GitHub handle, or GitHub user ID. Case-insensitive partial matching for strings, exact match for numeric IDs.",
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "type": "object"
}

Show output JSON schema

{
  "description": "Response from a people lookup query.",
  "properties": {
    "query": {
      "description": "The search query that was used",
      "type": "string"
    },
    "total_matches": {
      "description": "Number of matching records",
      "type": "integer"
    },
    "matches": {
      "description": "Matching person records",
      "items": {
        "description": "A person in the internal team roster.",
        "properties": {
          "slack_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Slack user ID"
          },
          "slack_display_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Slack display name"
          },
          "slack_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Email address from Slack profile"
          },
          "github_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "GitHub numeric user ID"
          },
          "github_handle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "GitHub username"
          },
          "github_public_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Public email from GitHub profile"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "required": [
    "query",
    "total_matches",
    "matches"
  ],
  "type": "object"
}

  1# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
  2"""MCP tools for internal team roster lookup.
  3
  4This module exposes people lookup operations as MCP tools for AI agents.
  5These are thin wrappers around the core functions in internal_team_roster module.
  6
  7## MCP reference
  8
  9.. include:: ../../../docs/mcp-generated/people_lookup.md
 10    :start-line: 2
 11"""
 12
 13from __future__ import annotations
 14
 15__all__: list[str] = []
 16
 17from typing import Annotated
 18
 19from fastmcp import FastMCP
 20from fastmcp_extensions import mcp_tool, register_mcp_tools
 21from pydantic import BaseModel, Field
 22
 23from airbyte_ops_mcp.internal_team_roster import fetch_roster, search_roster
 24
 25
 26class PersonRecord(BaseModel):
 27    """A person in the internal team roster."""
 28
 29    slack_id: str | None = Field(default=None, description="Slack user ID")
 30    slack_display_name: str | None = Field(
 31        default=None, description="Slack display name"
 32    )
 33    slack_email: str | None = Field(
 34        default=None, description="Email address from Slack profile"
 35    )
 36    github_id: int | None = Field(default=None, description="GitHub numeric user ID")
 37    github_handle: str | None = Field(default=None, description="GitHub username")
 38    github_public_email: str | None = Field(
 39        default=None, description="Public email from GitHub profile"
 40    )
 41
 42
 43class PeopleLookupResponse(BaseModel):
 44    """Response from a people lookup query."""
 45
 46    query: str = Field(description="The search query that was used")
 47    total_matches: int = Field(description="Number of matching records")
 48    matches: list[PersonRecord] = Field(description="Matching person records")
 49
 50
 51class RosterListResponse(BaseModel):
 52    """Response listing the full internal team roster."""
 53
 54    total_members: int = Field(description="Total number of members in the roster")
 55    members: list[PersonRecord] = Field(description="All person records in the roster")
 56
 57
 58@mcp_tool(
 59    read_only=True,
 60    idempotent=True,
 61)
 62def lookup_person(
 63    query: Annotated[
 64        str,
 65        Field(
 66            description=(
 67                "Search query to match against any field: email address, "
 68                "Slack display name, Slack user ID, GitHub handle, or GitHub user ID. "
 69                "Case-insensitive partial matching for strings, exact match for numeric IDs."
 70            )
 71        ),
 72    ],
 73) -> PeopleLookupResponse:
 74    """Look up a person in the Airbyte internal team roster.
 75
 76    Searches the daily-generated roster artifact by any field value.
 77    The roster is built from Slack and GitHub org membership data,
 78    cross-referenced by email address.
 79
 80    Use this to find someone's Slack ID for messaging, GitHub handle
 81    for code review, or to cross-reference identities across platforms.
 82    """
 83    roster = fetch_roster()
 84    matches = search_roster(roster, query)
 85    return PeopleLookupResponse(
 86        query=query,
 87        total_matches=len(matches),
 88        matches=[PersonRecord.model_validate(person) for person in matches],
 89    )
 90
 91
 92@mcp_tool(
 93    read_only=True,
 94    idempotent=True,
 95)
 96def list_team_roster() -> RosterListResponse:
 97    """List the full Airbyte internal team roster.
 98
 99    Returns all members from the daily-generated roster artifact.
100    The roster is sorted by Slack display name for easy scanning.
101    Use lookup_person for targeted searches instead of scanning the full list.
102    """
103    roster = fetch_roster()
104    return RosterListResponse(
105        total_members=len(roster),
106        members=[PersonRecord.model_validate(person) for person in roster],
107    )
108
109
110def register_people_lookup_tools(app: FastMCP) -> None:
111    """Register people lookup tools with the FastMCP app."""
112    register_mcp_tools(app, mcp_module=__name__)