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__)