构建Testlink MCP并集成到Copilot(一)
现在已经完成了从需求分析->自动生成用例->自动生成脚本的过程,全部通过预定义的prompts和instructions让Copilot来完成的, 几乎不需要人为干涉了。
会从jira、swagger、wiki、changelog、merge request里获取信息来确定需求及变更,生成符合要求的用例,保存本地或者自动创建在testlink,可以立刻生成自动化脚本,也可以过些时候,指定testlink的测试集来生成自动化脚本。
在这个流程中,增加了testlink的mcp server。因为testlink是个比较老的产品了,没有官方的mcp,于是根据公司内部需求自己给做了一个。testlink mcp在这个自动生成的流程中的作用是:分析需求后生成的测试用例直接保存在testlink与成员共享,直接获取testlink的新老case来生成自动化脚本。至于自动运行、自动分析错误、自动上线那是之后的事情了,不在这几篇文章里记录。
这里会以testlink部分功能为例介绍如何构建一个简易的mcp server。
--------
正式开始。
选择使用python3.12,基于FastMCP来构建,部署到服务器上用的uvicorn和nginx。对于testlink,因为还在用1.9.20的版本,一个比较老的testlink-api-python-client还能用上。
安装uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
添加项目依赖:
uv add fastmcp testlink-api-python-client
uv sync
此时,项目根目录会新建一个.venv的目录,包含了需要的python包,可以直接激活这个虚拟环境。
为了能与testlink交互,需要先获取testlink的api key,代表登陆人身份。
登陆testlink后,在主页左上角点击my settings的图标

进入设置页面,如果从来没有生成过api key的话,需要点击'generate a new key', 已有的话直接复制key的值。

接下来先加一个在copilot里用提示词查询testlink版本的简单方法。
新增一个testlink的帮助类,utils/testlink_util.py,只用于获取链接。
import testlink
class TestLinkUtils:
def __init__(self, api_key):
self.url = "http://testlink_server_url/lib/api/xmlrpc/v1/xmlrpc.php"
self.key = api_key
self._client = None
def get_client(self):
if self._client is None:
self._client = testlink.TestlinkAPIClient(self.url, self.key)
return self._client
在根目录新建一个server.py
from fastmcp import FastMCP
from utils.testlink_utils import TestLinkUtils
app = FastMCP("TESTLINK MCP Server")
def handle_headers():
headers = get_http_headers()
api_key = headers.get("devkey")
return TestLinkUtils(api_key)
@app.tool()
def get_version() -> dict:
"""Retrieves version of testlink."""
try:
tl = handle_headers().get_client()
version = tl.testLinkVersion()
return {"testlink_version": version}
except Exception as e:
return {"error": f"Failed to get TestLink version: {str(e)}"}
if __name__ == "__main__":
app.run(transport="http", port=8000) # 这个之后要改
这里的http是能够将来部署后被网络上调用的意思。stdio则是本地调试的意思。
然后运行python server.py, 能看到fastmcp启动了一个server,这时在vscode或者pycharm里加一下mcp.json的配置即可在copilot中使用。
INFO Starting MCP server 'TESTLINK MCP Server' with transport 'http' on http://127.0.0.1:8000/mcp server.py:2618
INFO: Started server process [16384]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
server启动后需要一个client,而client就是copilot。现在去IDE配置一下mcp.json并启动连接即可。
对于vscode,在打开的项目工程的根目录,有个.vscode的目录,里面往往有launch.json用于启动和调试,在同一个目录,新增一个mcp.json,输入下面的内容。需要注意的是,header里的devkey便是上文中从testlink里生成的,这个值会传给mcp server,不同的人通过copilot操作,会留下他自己的操作痕迹,也会遵循一些权限管理。
{
"servers": {
"mcp-testlink": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp",
"headers": {
"devkey": "testlink api key"
}
}
}
}
而pycharm的mcp.json相当于一个全局的,路径mac上是~/.config/github-copilot/intellij/mcp.json。配置信息中header那里有少许不同。
{
"servers": {
"mcp-testlink": {
"type": "http",
"url": "http;//127.0.0.1:8000/mcp",
"requestInit": {
"headers": {
"devkey": "testlink api key"
}
}
}
}
}
配置好mcp.json后,vscode能看到一个start的link,点击一下便能启动链接,而pycharm则是重启后自动链接。
此时在copilot对话中询问testlink的版本则能获取对应信息,如果不启动这个server,copilot知道testlink是什么,但不知道去哪里取,取哪个。

现在最简单的效果看到了,接下来会开始添加testlink内操作的tool。