Skip to main content
Glama

Confluence MCP Server

confluence_utils.py3.82 kB
import os from atlassian import Confluence import urllib from dotenv import load_dotenv class ConfluenceUtils: def __init__(self): load_dotenv() self.token = os.environ.get("CONFLUENCE_TOKEN") self.url = os.environ.get("CONFLUENCE_URL") self.username = os.environ.get("CONFLUENCE_USERNAME") self.password = os.environ.get("CONFLUENCE_PASSWORD") self.headers = { "Authorization": "Bearer " + self.token, 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"', 'sec-ch-ua-platform': 'macOS', 'Referer': '', # 这里看起来是一个错误,Referer 头部应该是一个完整的 URL,这里留空 'DNT': '1', 'sec-ch-ua-mobile': '?0', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0', 'content-type': 'application/json' } self.page_url = urllib.parse.urljoin( self.url, "pages/viewpage.action?pageId={page_id}") self.confluence = Confluence( url=self.url, token=self.token, cloud=False ) def search_by_key(self, key, limit=10): """ 搜索 Confluence 页面(标题和内容) :param key: 搜索关键字 :param limit: 返回结果数量限制 :return: 搜索结果列表,每个结果包含页面基本信息 """ # 使用 CQL 搜索标题和内容 cql = f'text ~ "{key}" OR title ~ "{key}"' results = self.confluence.cql(cql, limit=limit) if not results or 'results' not in results: return [] # 格式化返回结果 formatted_results = [] for result in results['results']: formatted_results.append({ 'id': result.get('content', {}).get('id'), 'title': result.get('content', {}).get('title'), 'type': result.get('content', {}).get('type'), 'url': self.page_url.format(page_id=result.get('content', {}).get('id')), 'excerpt': result.get('excerpt', '') # 搜索结果中的匹配内容片段 }) return formatted_results def get_page_content(self, page_id): """ 获取页面的完整信息 :param page_id: 页面 ID :return: 包含页面详细信息的字典 """ page = self.confluence.get_page_by_id( page_id, expand='body.storage,version,space,history,metadata.labels' ) if not page: return None # 构建完整的页面信息 page_info = { 'id': page.get('id'), 'title': page.get('title'), 'space': { 'key': page.get('space', {}).get('key'), 'name': page.get('space', {}).get('name') }, 'version': page.get('version', {}).get('number'), 'content': page.get('body', {}).get('storage', {}).get('value'), 'url': self.page_url.format(page_id=page_id), 'created': { 'date': page.get('history', {}).get('createdDate'), 'by': page.get('history', {}).get('createdBy', {}).get('displayName') }, 'modified': { 'date': page.get('version', {}).get('when'), 'by': page.get('version', {}).get('by', {}).get('displayName') }, 'labels': [label.get('name') for label in page.get('metadata', {}).get('labels', {}).get('results', [])] } return page_info cf = ConfluenceUtils()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/xiandan-erizo/ops-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server