Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit901b16a

Browse files
committed
initial commit
0 parents  commit901b16a

File tree

7 files changed

+413
-0
lines changed

7 files changed

+413
-0
lines changed

‎.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.idea

‎README.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#GitHub MCP Server
2+
3+
GitHub MCP Server implemented in Go.
4+
5+
##Setup
6+
7+
Create a GitHub Personal Access Token with the appropriate permissions
8+
and set it as the GITHUB_PERSONAL_ACCESS_TOKEN environment variable.
9+
10+
11+
##Tools
12+
13+
1.`get_me`
14+
- Return information about the authenticated user
15+
2.`get_issue`
16+
- Get the contents of an issue within a repository.
17+
- Inputs
18+
-`owner` (string): Repository owner
19+
-`repo` (string): Repository name
20+
-`issue_number` (number): Issue number to retrieve
21+
- Returns: Github Issue object & details
22+
23+
##Standard input/output server
24+
25+
```sh
26+
go run cmd/server/main.go stdio
27+
```
28+
29+
E.g:
30+
31+
Set the PAT token in the environment variable and run:
32+
33+
```sh
34+
script/get-me
35+
```
36+
37+
And you should see the output of the GitHub MCP server responding with the user information.
38+
39+
```sh
40+
GitHub MCP Server running on stdio
41+
{
42+
"jsonrpc":"2.0",
43+
"id": 3,
44+
"result": {
45+
"content": [
46+
{
47+
"type":"text",
48+
"text":"{\"login\":\"juruen\",\"id\" ... }
49+
}
50+
]
51+
}
52+
}
53+
54+
```
55+

‎cmd/server/main.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
stdlog"log"
7+
"os"
8+
"os/signal"
9+
"syscall"
10+
11+
"github.com/github/mcp-server-playground/pkg/github"
12+
gogithub"github.com/google/go-github/v69/github"
13+
"github.com/mark3labs/mcp-go/server"
14+
log"github.com/sirupsen/logrus"
15+
"github.com/spf13/cobra"
16+
"github.com/spf13/viper"
17+
)
18+
19+
var (
20+
rootCmd=&cobra.Command{
21+
Use:"server",
22+
Short:"GitHub MCP Server",
23+
Long:`A GitHub MCP server that handles various tools and resources.`,
24+
PersistentPreRun:func(cmd*cobra.Command,args []string) {
25+
// Bind flag to viper
26+
viper.BindPFlag("log-file",cmd.PersistentFlags().Lookup("log-file"))
27+
},
28+
}
29+
30+
stdioCmd=&cobra.Command{
31+
Use:"stdio",
32+
Short:"Start stdio server",
33+
Long:`Start a server that communicates via standard input/output streams using JSON-RPC messages.`,
34+
Run:func(cmd*cobra.Command,args []string) {
35+
logFile:=viper.GetString("log-file")
36+
logger,err:=initLogger(logFile)
37+
iferr!=nil {
38+
stdlog.Fatal("Failed to initialize logger:",err)
39+
}
40+
iferr:=runStdioServer(logger);err!=nil {
41+
stdlog.Fatal("failed to run stdio server:",err)
42+
}
43+
},
44+
}
45+
)
46+
47+
funcinit() {
48+
cobra.OnInitialize(initConfig)
49+
50+
// Add global flags that will be shared by all commands
51+
rootCmd.PersistentFlags().String("log-file","","Path to log file")
52+
53+
// Add subcommands
54+
rootCmd.AddCommand(stdioCmd)
55+
}
56+
57+
funcinitConfig() {
58+
// Initialize Viper configuration
59+
viper.SetEnvPrefix("APP")
60+
viper.AutomaticEnv()
61+
}
62+
63+
funcinitLogger(outPathstring) (*log.Logger,error) {
64+
ifoutPath=="" {
65+
returnlog.New(),nil
66+
}
67+
68+
file,err:=os.OpenFile(outPath,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)
69+
iferr!=nil {
70+
returnnil,fmt.Errorf("failed to open log file: %w",err)
71+
}
72+
73+
logger:=log.New()
74+
logger.SetOutput(file)
75+
76+
returnlogger,nil
77+
}
78+
79+
funcrunStdioServer(logger*log.Logger)error {
80+
// Create app context
81+
ctx,stop:=signal.NotifyContext(context.Background(),os.Interrupt,syscall.SIGTERM)
82+
deferstop()
83+
84+
// Create GH client
85+
token:=os.Getenv("GITHUB_PERSONAL_ACCESS_TOKEN")
86+
iftoken=="" {
87+
logger.Fatal("GITHUB_PERSONAL_ACCESS_TOKEN not set")
88+
}
89+
ghClient:=gogithub.NewClient(nil).WithAuthToken(token)
90+
91+
// Create server
92+
ghServer:=github.NewServer(ghClient)
93+
stdioServer:=server.NewStdioServer(ghServer)
94+
95+
stdLogger:=stdlog.New(logger.Writer(),"stdioserver",0)
96+
stdioServer.SetErrorLogger(stdLogger)
97+
98+
// Start listening for messages
99+
errC:=make(chanerror,1)
100+
gofunc() {
101+
errC<-stdioServer.Listen(ctx,os.Stdin,os.Stdout)
102+
}()
103+
104+
// Output github-mcp-server string
105+
_,_=fmt.Fprintf(os.Stderr,"GitHub MCP Server running on stdio\n")
106+
107+
// Wait for shutdown signal
108+
select {
109+
case<-ctx.Done():
110+
logger.Infof("shutting down server...")
111+
caseerr:=<-errC:
112+
iferr!=nil {
113+
returnfmt.Errorf("error running server: %w",err)
114+
}
115+
}
116+
117+
returnnil
118+
}
119+
120+
funcmain() {
121+
iferr:=rootCmd.Execute();err!=nil {
122+
fmt.Println(err)
123+
os.Exit(1)
124+
}
125+
}

‎go.mod

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
modulegithub.com/github/mcp-server-playground
2+
3+
go1.23
4+
5+
require (
6+
github.com/google/go-github/v69v69.2.0
7+
github.com/mark3labs/mcp-gov0.11.2
8+
github.com/sirupsen/logrusv1.9.3
9+
github.com/spf13/cobrav1.9.1
10+
github.com/spf13/viperv1.19.0
11+
)
12+
13+
require (
14+
github.com/fsnotify/fsnotifyv1.7.0// indirect
15+
github.com/google/go-querystringv1.1.0// indirect
16+
github.com/google/uuidv1.6.0// indirect
17+
github.com/hashicorp/hclv1.0.0// indirect
18+
github.com/inconshreveable/mousetrapv1.1.0// indirect
19+
github.com/magiconair/propertiesv1.8.7// indirect
20+
github.com/mitchellh/mapstructurev1.5.0// indirect
21+
github.com/pelletier/go-toml/v2v2.2.2// indirect
22+
github.com/sagikazarmark/locaferov0.4.0// indirect
23+
github.com/sagikazarmark/slog-shimv0.1.0// indirect
24+
github.com/sourcegraph/concv0.3.0// indirect
25+
github.com/spf13/aferov1.11.0// indirect
26+
github.com/spf13/castv1.6.0// indirect
27+
github.com/spf13/pflagv1.0.6// indirect
28+
github.com/subosito/gotenvv1.6.0// indirect
29+
go.uber.org/atomicv1.9.0// indirect
30+
go.uber.org/multierrv1.9.0// indirect
31+
golang.org/x/expv0.0.0-20230905200255-921286631fa9// indirect
32+
golang.org/x/sysv0.18.0// indirect
33+
golang.org/x/textv0.14.0// indirect
34+
gopkg.in/ini.v1v1.67.0// indirect
35+
gopkg.in/yaml.v3v3.0.1// indirect
36+
)

‎go.sum

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
github.com/cpuguy83/go-md2man/v2v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
2+
github.com/davecgh/go-spewv1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/davecgh/go-spewv1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spewv1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
5+
github.com/davecgh/go-spewv1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/frankban/quicktestv1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
7+
github.com/frankban/quicktestv1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
8+
github.com/fsnotify/fsnotifyv1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
9+
github.com/fsnotify/fsnotifyv1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
10+
github.com/google/go-cmpv0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
11+
github.com/google/go-cmpv0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
12+
github.com/google/go-cmpv0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
13+
github.com/google/go-github/v69v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE=
14+
github.com/google/go-github/v69v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM=
15+
github.com/google/go-querystringv1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
16+
github.com/google/go-querystringv1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
17+
github.com/google/uuidv1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
18+
github.com/google/uuidv1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
19+
github.com/hashicorp/hclv1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
20+
github.com/hashicorp/hclv1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
21+
github.com/inconshreveable/mousetrapv1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
22+
github.com/inconshreveable/mousetrapv1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
23+
github.com/kr/prettyv0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
24+
github.com/kr/prettyv0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
25+
github.com/kr/textv0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
26+
github.com/kr/textv0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
27+
github.com/magiconair/propertiesv1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
28+
github.com/magiconair/propertiesv1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
29+
github.com/mark3labs/mcp-gov0.11.2 h1:mCxWFUTrcXOtJIn9t7F8bxAL8rpE/ZZTTnx3PU/VNdA=
30+
github.com/mark3labs/mcp-gov0.11.2/go.mod h1:cjMlBU0cv/cj9kjlgmRhoJ5JREdS7YX83xeIG9Ko/jE=
31+
github.com/mitchellh/mapstructurev1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
32+
github.com/mitchellh/mapstructurev1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
33+
github.com/pelletier/go-toml/v2v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
34+
github.com/pelletier/go-toml/v2v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
35+
github.com/pmezard/go-difflibv1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
36+
github.com/pmezard/go-difflibv1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
37+
github.com/pmezard/go-difflibv1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
38+
github.com/rogpeppe/go-internalv1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
39+
github.com/rogpeppe/go-internalv1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
40+
github.com/russross/blackfriday/v2v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
41+
github.com/sagikazarmark/locaferov0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
42+
github.com/sagikazarmark/locaferov0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
43+
github.com/sagikazarmark/slog-shimv0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
44+
github.com/sagikazarmark/slog-shimv0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
45+
github.com/sirupsen/logrusv1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
46+
github.com/sirupsen/logrusv1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
47+
github.com/sourcegraph/concv0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
48+
github.com/sourcegraph/concv0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
49+
github.com/spf13/aferov1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
50+
github.com/spf13/aferov1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
51+
github.com/spf13/castv1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
52+
github.com/spf13/castv1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
53+
github.com/spf13/cobrav1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
54+
github.com/spf13/cobrav1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
55+
github.com/spf13/pflagv1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
56+
github.com/spf13/pflagv1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
57+
github.com/spf13/viperv1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
58+
github.com/spf13/viperv1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
59+
github.com/stretchr/objxv0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
60+
github.com/stretchr/objxv0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
61+
github.com/stretchr/objxv0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
62+
github.com/stretchr/objxv0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
63+
github.com/stretchr/testifyv1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
64+
github.com/stretchr/testifyv1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
65+
github.com/stretchr/testifyv1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
66+
github.com/stretchr/testifyv1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
67+
github.com/stretchr/testifyv1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
68+
github.com/stretchr/testifyv1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
69+
github.com/stretchr/testifyv1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
70+
github.com/subosito/gotenvv1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
71+
github.com/subosito/gotenvv1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
72+
go.uber.org/atomicv1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
73+
go.uber.org/atomicv1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
74+
go.uber.org/multierrv1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
75+
go.uber.org/multierrv1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
76+
golang.org/x/expv0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
77+
golang.org/x/expv0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
78+
golang.org/x/sysv0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
79+
golang.org/x/sysv0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
80+
golang.org/x/sysv0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
81+
golang.org/x/textv0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
82+
golang.org/x/textv0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
83+
golang.org/x/xerrorsv0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
84+
gopkg.in/check.v1v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
85+
gopkg.in/check.v1v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
86+
gopkg.in/check.v1v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
87+
gopkg.in/ini.v1v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
88+
gopkg.in/ini.v1v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
89+
gopkg.in/yaml.v3v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
90+
gopkg.in/yaml.v3v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
91+
gopkg.in/yaml.v3v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp